例如来自bash:
kill -9 -PID
os.kill(pid, signal.SIGKILL)
仅杀死父进程。
答案 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)