如何从python中杀死进程和子进程?

时间:2011-07-01 15:00:16

标签: python

例如来自bash:

kill -9 -PID 

os.kill(pid, signal.SIGKILL)仅杀死父进程。

6 个答案:

答案 0 :(得分:30)

当您将否定 PID传递给kill时,它实际上会通过该(绝对)数字将信号发送到进程。您在Python中使用os.killpg()执行等效操作。

答案 1 :(得分:18)

如果父流程不是"流程组"但你想用孩子杀死它,你可以使用psutil(https://pythonhosted.org/psutil/#processes)。 os.killpg无法识别非进程组的pid。

import psutil

parent_pid = 30437   # my example
parent = psutil.Process(parent_pid)
for child in parent.children(recursive=True):  # or parent.children() for recursive=False
    child.kill()
parent.kill()

答案 2 :(得分:5)

如果您的进程不是进程组不想使用psutil ,则另一种解决方案是运行此shell命令:

pkill -TERM -P 12345

例如

os.system('pkill -TERM -P {pid}'.format(pid=12345))

答案 3 :(得分:0)

你应该使用信号参数9来杀死进程树 root @ localhost:〜$ python
>>> import os
>>> os.kill(pid,9)

如果你应该使用signal.SIGKILL常量,你应该使用os.killpg(pgid,signal.SIGKILL)来杀死进程树。

答案 4 :(得分:0)

没有答案可以帮助我,所以我进行了一些研究并写下了答案: 您可以使用os模块轻松完成此操作,但是它对平台敏感。这意味着某些命令仅在Unix上可用,而某些命令在任何平台上均可用。 因此,我的项目启动了一个流程,并在不同的位置和时间启动了多个子流程。一些孩子开始了子孙过程:) 所以我找到了解决方案:

import os
imprt signal
import platform
# get the current PID for safe terminate server if needed:
PID = os.getpid()
if platform.system() is not 'Windows':
    PGID = os.getpgid(PID)
if platform.system() is not 'Windows':
    os.killpg(PGID, signal.SIGKILL)
else:
    os.kill(PID, signal.SIGTERM)

我在Linux上使用SIGKILL立即终止进程,在Windows上使用SIGTERM,因为上面没有SIGKILL。 我还用killpg()杀死了Linux上的整个进程。

P.S。在Linux上进行检查,但在Windows上仍然不进行检查,因此也许我们还需要Windows的其他命令(例如CTRL_C_EVENT或use another answer。)

答案 5 :(得分:0)

我不知道这是否是您要的,但是如果您想终止应用程序的其他进程,并且这些进程都是使用多处理程序包创建的,则可以执行以下操作:

import multiprocessing
from time import sleep

...

def on_shutdown():
    for child in multiprocessing.active_children():
        print('Terminating', child)
        child.terminate()
        sleep(0.5)