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

标签 python linux process system-calls

我需要编写一段代码来检查同名的 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/

相关文章:

python - Azure 函数 - HTTP 触发器和响应 - Python

linux - -zxvf 在 tar -zxvf <文件名> 中是什么意思?

linux - 在 shell (linux) 的输入重定向中,每个命令的处理方式是否不同?

c++ - 从十六进制转换为 LPCVOID 切断了地址的一半

python - 在 Python 类中的何处建立数据库连接以运行多个查询?

python - Pandas 将多个数据框合并并更新为一列

python | Pygame | Sprite 碰撞

python - 在 ubuntu 中嵌入 python 时出现段错误

python - 使用 psutil 设置进程优先级

process - 如何在不阻塞Rust的情况下读取子进程的输出?