gpt4 book ai didi

python - 如果另一个实例已经在运行,如何杀死 python 脚本及其子脚本

转载 作者:太空狗 更新时间:2023-10-29 12:41:41 25 4
gpt4 key购买 nike

我需要编写一段代码来检查同名的 python 脚本的另一个实例是否正在运行,杀死它和它的所有子脚本并完成脚本的工作。在解决问题的路上,我有这段代码:

import os, sys
import time
import subprocess
from subprocess import PIPE,Popen
import os
import signal


if sys.argv[1] == 'boss':
print 'I am boss', \
"pid:", os.getpid(), \
"pgid:", os.getgid()


# kill previous process with same name
my_pid=os.getpid()
pgrep = Popen(['pgrep', '-f', 'subp_test.py'], stdout=PIPE)

prev_pids=pgrep.communicate()[0].split()
print 'previous processes:' , prev_pids

for pid in prev_pids:
if int(pid) !=int(my_pid):
print 'killing', pid
os.kill(int(pid), signal.SIGKILL)

# do the job
subprocess.call('python subp_test.py 1', shell=True)
subprocess.call('python subp_test.py 2', shell=True)
subprocess.call('python some_other_script.py', shell=True)

else:
p_num = sys.argv[1]
for i in range(20):
time.sleep(1)
print 'child', p_num, \
"pid:", os.getpid(), \
"pgid:", os.getgid(), \
":", i

这将杀死所有在其命令中包含子字符串 'subp_test.py' 的进程,但不会杀死 some_other_script.py 或其他不包含 'subp_test.py' 的程序。

脚本 subp_test.py 将执行的调用是出乎意料的,但据我所知,它们应该在进程树的下面。

那么我如何访问 subp_test.py 的所有子项以便在 subp_test.py 的新实例开始运行时杀死它们?

此外,是否有更好的方法来实现此逻辑?

我在 Ubuntu 10.04 上使用 Python 2.6.5。

最佳答案

在新的 session 组下运行您的程序,并将 session 组 ID 写入文件。当您的程序启动时,kill -SIGNAL -prevsessiongroup。这将杀死所有进程及其子进程等,除非其中一个进程明确更改 session 组。我提供了包含您可以使用的代码片段的网址。

https://docs.python.org/2/library/os.html#os.setsid http://web.archive.org/web/20131017130434/http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

关于python - 如果另一个实例已经在运行,如何杀死 python 脚本及其子脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40590228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com