繁体   English   中英

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

[英]Check if subprocess called with shell=True is still running

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

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())

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

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

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进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM