检查用shell = True调用的子进程是否仍在运行

时间:2018-09-14 02:33:38

标签: python subprocess

我有一个出于某些原因的程序,我必须致电以下内容(请不要判断...)

process = subprocess.Popen("some_command &", shell=True, executable='/bin/bash')

some_command应该会在满足某些外部条件时自行终止。

如何检查some_command何时终止?

process.poll() 

总是返回0

一个简单的脚本来演示我的情况:

import subprocess

process = subprocess.Popen("sleep 5 &", shell=True, executable='/bin/bash')

while True:
    print(process.poll())

1 个答案:

答案 0 :(得分:2)

some_command &告诉bash在后​​台运行some_command。这意味着您的shell启动some_command,然后立即退出,从而切断了运行的some_command与Python进程之间的联系(毕竟some_command的父进程不再存在)。 poll()准确地报告了bash本身已完成运行,并以状态0退出;不知道some_command会发生什么或不会发生;这是bash的问题(bash也不在乎)。

如果您希望能够轮询以检查some_command是否仍在运行,请不要通过bash shell元字符将其作为背景;如果没有&bash将继续运行直到完成,因此some_command本身仍在运行,您将间接指示bash何时完成。它仍然在后台(从某种意义上说,它与Python代码并行运行;除非您使用{{1}显式waitcommunicate,否则Python进程将不会等待它或其他任何东西。 }):

process

当然,除非process = subprocess.Popen("some_command", shell=True, executable='/bin/bash') 是内置的some_command,否则bash只会妨碍您;如bash所述,除非您明确要求subprocess.Popen,否则总是在后台运行内容,因此您不需要wait的帮助就可以将任何背景信息:

bash

会得到类似的行为,实际上,您可以直接检查来自process = subprocess.Popen(["some_command"]) 的返回代码,而无需涉及中介some_command进程。