我正在使用以下命令启动子进程:
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用时杀死:
p.terminate()
Run Code Online (Sandbox Code Playgroud)
要么
p.kill()
Run Code Online (Sandbox Code Playgroud)
该命令在后台继续运行,所以我想知道如何实际终止该进程.
请注意,当我运行命令时:
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
它在发出时会成功终止p.terminate().
我试图检测安装程序何时从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 - >(未知)
python 是否提供了一种方法来查找使用子进程生成的子进程的子进程,以便我可以正确地杀死它们?如果不是,有什么好的方法可以确保孩子的孩子被杀死?