Python:如何确定子进程的子进程都已运行完毕

2024-10-01 19:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图检测安装程序何时从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()

这里有一个类似的问题:Killing a subprocess including its children from python,但是所选的答案没有解决子问题,而是指示用户直接调用应用程序等待。我正在寻找一个特定的解决方案,它将等待子进程的所有子进程。如果有未知数量的子进程怎么办?我将选择解决等待所有子进程完成的问题的答案。在

更清楚地说明失败:子进程在wait()命令之后继续执行,因为该命令只等待顶级进程(在本例中是“sudo”)。以下是此问题中已知子进程的简单示意图: Python子进程模块->Sudo->runInstaller->java->;(未知)


Tags: 模块答案代码命令应用程序进程sudodatabase
3条回答

好吧,这里有一个技巧,它只在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)

我没有测试过这个。它创建了一个额外的子流程作为流程组的领导,但是避免这一点(我认为)要复杂得多。在

我发现这个网页也很有用。http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/

您可以在pid设置为-1的情况下使用os.waitpid,这将等待当前进程的所有子进程,直到它们完成:

import os
import sys
import subprocess


proc = subprocess.Popen([sys.executable,
                         '-c',
                         'import subprocess;'
                         'subprocess.Popen("sleep 5", shell=True).wait()'])

pid, status = os.waitpid(-1, 0)

print pid, status

这是分支不同子进程的pstree <pid>的结果:

^{pr2}$

希望这能有所帮助:)

查看下面的链接http://www.oracle-wiki.net/startdocsruninstaller,其中详细说明了可以用于runInstaller命令的标志。在

这个标志肯定适用于11gR2,但是我还没有一个10g数据库来为与该版本一起打包的runInstaller试用这个标志。在

问候

相关问题 更多 >

    热门问题