Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查进程是否仍在运行_Python_Linux_Bash_Process_Psutil - Fatal编程技术网

Python 检查进程是否仍在运行

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

我有以下问题:

我需要我的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 = 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,所以我不能用名字杀死它。