Подтвердить что ты не робот

Как убить процесс и дочерние процессы из python?

например, из bash:

kill -9 -PID 

os.kill(pid, signal.SIGKILL) убить только родительский процесс.

4b9b3361

Ответ 1

Когда вы передаете отрицательный PID на kill, он фактически посылает сигнал в группу процессов этим (абсолютным) числом. Вы выполняете эквивалент с os.killpg() в Python.

Ответ 2

Если родительский процесс не является "группой процессов", но вы хотите убить его с помощью детей, вы можете использовать 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()

Ответ 3

Другое решение, если ваш процесс не является группой процессов, а вы не хотите использовать psutil, должен запустить эту команду оболочки:

pkill -TERM -P 12345

Например,

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

Ответ 4

Вы должны использовать параметр сигнала 9, чтобы убить дерево процессов.

[email protected]:~$ python
>>> import os
>>> os.kill(pid, 9)

если вы должны использовать signal.SIGKILL constant, вы должны использовать os.killpg(pgid, signal.SIGKILL) для уничтожения дерева процессов.

Ответ 5

Ни один из ответов не помог мне, поэтому я провел небольшое исследование и написал свой ответ: Вы можете легко сделать это, используя модуль 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 или используйте другой ответ.)