Python 检查进程是否仍在运行
我有以下问题: 我需要我的Python脚本运行bash脚本。如果bash脚本的运行时间超过10秒,我需要终止它。这就是我到目前为止所做的:Python 检查进程是否仍在运行,python,linux,bash,process,psutil,Python,Linux,Bash,Process,Psutil,我有以下问题: 我需要我的Python脚本运行bash脚本。如果bash脚本的运行时间超过10秒,我需要终止它。这就是我到目前为止所做的: cmd = ["bash", "script.sh", self.get_script_path()] process = subprocess.Popen(cmd) time.sleep(10) # process running here... procinfo = psutil.Process(process.pid) children = pr
cmd = ["bash", "script.sh", self.get_script_path()]
process = subprocess.Popen(cmd)
time.sleep(10) # process running here...
procinfo = psutil.Process(process.pid)
children = procinfo.children(recursive=True)
for child in children:
os.kill(child.pid, signal.SIGKILL)
我担心的是这种情况:bash脚本在1秒内完成,释放其PID,系统将PID传递给另一个进程。10秒后,我杀死PID,我认为它属于我的脚本,但它不是真的,我杀死了一些其他进程。脚本需要以root身份运行,因为我需要chroot
有什么想法吗?我在ubuntu上使用命令stop process\u name来停止我的进程。 希望这会有帮助。我认为这个命令非常适合你。从文档页面: 提要 超时[选项]编号[后缀]命令[ARG]…
超时[选项]
描述 启动命令,如果在数秒后仍在运行,则将其杀死。后缀可以是“s”表示秒(默认值),“m”表示分钟,“h”表示小时,或“d”表示天 -s,-signal=信号
指定超时时要发送的信号。
信号可以是“HUP”之类的名称或数字。
有关信号列表,请参见“kill-l” 通过依赖于
超时
,您不必担心PID重用、竞争条件等混乱的细节。这些问题很好地封装在这个标准Unix实用程序中。另一个好处是,在子进程提前终止时,脚本将立即恢复执行,而不是在整整10秒钟内不必要地休眠
bash中的演示:
timeout -s9 10 sleep 11; echo $?;
## Killed
## 137
timeout -s9 10 sleep 3; echo $?;
## 0
python演示:
import subprocess;
subprocess.Popen(['timeout','-s9','10','sleep','11']).wait();
## -9
subprocess.Popen(['timeout','-s9','10','sleep','3']).wait();
## 0
由于您已经在使用
psutil
我建议您将对子流程
模块的调用替换为对的调用。此类具有与subprocess.Popen
相同的接口,但提供了psutil.Process
的所有功能
还请注意,psutil库预先检查PID重用,至少检查一些方法,包括终止
和终止
(请阅读)
这意味着以下代码:
cmd = ["bash", "script.sh", self.get_script_path()]
process = psutil.Popen(cmd)
time.sleep(10) # process running here...
children = process.children(recursive=True)
for child in children:
child.terminate() # try to close the process "gently" first
child.kill()
请注意儿童的文档说明:
子对象(递归=False)
将此进程的子进程作为进程
对象的列表返回,预先检查PID是否已被重用。
总之,这意味着:
当您调用children
时,psutil
库检查您想要的是正确进程的子进程,而不是恰好具有相同pid的子进程
调用terminate
或kill
时,库确保您正在终止子进程,而不是具有相同pid的随机进程
如果子流程是在没有shell=True
的情况下创建的,那么您应该能够简单地使用。否则,请参阅“谢谢”,这可能会很有用。在这种情况下,我更喜欢本机python解决方案。无论如何,谢谢你的timeout
introduction:)对不起,我需要一个适用于所有linux发行版的解决方案。我说过脚本是以root运行的,所以我不理解这里的sudo
。最后,进程名是bash,所以我不能用名字杀死它。