pok*_*tad 5 python subprocess oracle10g spawning child-process
我试图检测安装程序何时从Python脚本中执行.具体来说,该应用程序是Oracle 10gR2数据库.目前我正在使用Popen的子进程模块.理想情况下,我只是使用wait()方法等待安装完成执行,但是,记录的命令实际上生成子进程来处理实际安装.以下是失败代码的示例代码:
import subprocess
OUI_DATABASE_10GR2_SUBPROCESS = ['sudo',
'-u',
'oracle',
os.path.join(DATABASE_10GR2_TMP_PATH,
'database',
'runInstaller'),
'-ignoreSysPrereqs',
'-silent',
'-noconfig',
'-responseFile '+ORACLE_DATABASE_10GR2_SILENT_RESPONSE]
oracle_subprocess = subprocess.Popen(OUI_DATABASE_10GR2_SUBPROCESS)
oracle_subprocess.wait()
Run Code Online (Sandbox Code Playgroud)
还有一个类似的问题在这里:杀害包括其子女从蟒蛇一子,但所选择的答案没有解决孩子的问题,而是指示用户直接调用应用程序等待.我正在寻找一个等待子进程的所有子进程的特定解决方案.如果有不确定数量的子流程怎么办?我将选择解决等待所有子进程完成的问题的答案.
更清楚失败:子进程在wait()命令之后继续执行,因为该命令只等待顶级进程(在这种情况下它是'sudo').下面是这个问题中已知子进程的简单图表:Python子进程模块 - > Sudo - > runInstaller - > java - >(未知)
好的,这是一个仅在 Unix 下有效的技巧。它类似于此问题的答案之一:Ensuring subprocesses are dead on exiting Python program。这个想法是创建一个新的进程组。然后,您可以等待组中的所有进程终止。
pid = os.fork()
if pid == 0:
os.setpgrp()
oracle_subprocess = subprocess.Popen(OUI_DATABASE_10GR2_SUBPROCESS)
oracle_subprocess.wait()
os._exit(0)
else:
os.waitpid(-pid)
Run Code Online (Sandbox Code Playgroud)
我没有测试过这个。它创建了一个额外的子进程作为进程组的领导者,但避免这种情况(我认为)要复杂一些。
我发现这个网页也很有帮助。 http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/
| 归档时间: |
|
| 查看次数: |
3405 次 |
| 最近记录: |