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

问题描述 投票:0回答:1

我有一个过程,出于某些原因,我必须打电话给以下(请不要判断......)

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())
python subprocess
1个回答
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 metacharacters对其进行后台处理;没有&bash将继续运行直到它完成,所以你将间接指示some_command何时完成bash本身仍在运行的事实。它仍然在后台(在某种意义上它与你的Python代码并行运行; Python进程不会停止等待它或任何东西除非你用wait明确地用communicateprocess):

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的返回码,没有涉及中间的bash进程。

© www.soinside.com 2019 - 2024. All rights reserved.