我有以下问题:
我需要我的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,我认为它属于我的脚本,但它不是真的,我杀死了一些其他进程。脚本需要以根用户身份运行,因为我需要在其中使用chroot
。在
有什么想法吗?在
由于您已经在使用
psutil
,我建议您将对subprocess
模块的调用替换为对{a1}的调用。此类具有相同的subprocess.Popen
接口,但提供psutil.Process
的所有功能。在还要注意,}(只需阅读documentation for ^{} )。在
psutil
库已经预先检查PID重用了,至少有很多方法包括terminate
和{这意味着以下代码:
请注意,
children
的文档说明:总之,这意味着:
children
时,psutil
库会检查是否需要正确进程的子进程,而不是恰好具有相同pid的进程的子进程terminate
或kill
时,库会确保您正在杀死子进程,而不是一个具有相同pid的随机进程。在我在ubuntu上使用命令stop process_name来停止我的进程。 希望对你有帮助。在
我认为^{} 命令非常适合您。从文档页面:
通过依赖
timeout
,您不必担心PID重用、争用条件等复杂的细节,这些关注点被很好地封装在这个标准的Unix实用程序中。另一个好处是您的脚本将在子进程提前终止时立即恢复执行,而不是不必要地休眠整整10秒。在bash演示:
python演示:
^{pr2}$相关问题 更多 >
编程相关推荐