например, из bash:
kill -9 -PID
os.kill(pid, signal.SIGKILL)
убить только родительский процесс.
например, из bash:
kill -9 -PID
os.kill(pid, signal.SIGKILL)
убить только родительский процесс.
Когда вы передаете отрицательный PID на kill
, он фактически посылает сигнал в группу процессов этим (абсолютным) числом. Вы выполняете эквивалент с os.killpg()
в Python.
Если родительский процесс не является "группой процессов", но вы хотите убить его с помощью детей, вы можете использовать psutil (https://pythonhosted.org/psutil/#processes). os.killpg не может идентифицировать pid не-process-group.
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()
Другое решение, если ваш процесс не является группой процессов, а вы не хотите использовать psutil, должен запустить эту команду оболочки:
pkill -TERM -P 12345
Например,
os.system('pkill -TERM -P {pid}'.format(pid=12345))
Вы должны использовать параметр сигнала 9, чтобы убить дерево процессов.
[email protected]:~$ python
>>> import os
>>> os.kill(pid, 9)
если вы должны использовать signal.SIGKILL constant
, вы должны использовать os.killpg(pgid, signal.SIGKILL)
для уничтожения дерева процессов.
Ни один из ответов не помог мне, поэтому я провел небольшое исследование и написал свой ответ:
Вы можете легко сделать это, используя модуль os
, но он чувствителен к платформе. Это означает, что некоторые команды доступны только в Unix, некоторые - на любой платформе.
Поэтому мой проект запускает один процесс и несколько дочерних процессов в разных местах и времени. Some of Child запускает процессы Grand-Child :)
Поэтому я нашел это решение:
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)
Я использую SIGKILL
в Linux, чтобы немедленно убить процесс, и SIGTERM
в Windows, потому что там нет SIGKILL
.
Также я использовал killpg()
, чтобы убить всю группу процессов в Linux.
Постскриптум Проверять в Linux, но все равно не проверять в Windows, поэтому, возможно, нам понадобится еще одна дополнительная команда для Windows (например, CTRL_C_EVENT или используйте другой ответ.)