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

18

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

kill -9 -PID 

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

    
задан Bdfy 01.07.2011 в 17:00
источник

4 ответа

28

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

    
ответ дан Thomas Wouters 01.07.2011 в 17:06
12

Если родительский процесс не является «группой процессов», но вы хотите убить его с помощью детей, вы можете использовать psutil ( Ссылка ). 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()
    
ответ дан jung rhew 20.11.2014 в 08:55
5

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

pkill -TERM -P 12345

Например,

os.system('pkill -TERM -P {pid}'.format(pid=12345))
    
ответ дан ther 01.05.2016 в 20:30
-1

вы должны использовать параметр сигнала 9, чтобы убить дерево процессов.
root @ localhost: ~ $ python
& GT; & GT; & GT; import os
& GT; & GT; & GT; os.kill (pid, 9)

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

    
ответ дан Alan Shi 01.07.2011 в 17:15
  • No. signal.SIGKILL - правильная константа для использования. –  Thomas Wouters 02.07.2011 в 00:30
  • os.kill (pid, 9) работает для меня, я использую python 2.7 на centos 5.6 –  Alan Shi 02.07.2011 в 16:27
  • Да, os.kill (pid, 9) работает, когда signal.SIGKILL бывает 9, что находится на большинстве платформ. Тем не менее, signal.SIGKILL является правильной константой для использования и вместо 9 используется вместо 9. SIGKILL не является улучшением и никак не решает проблему OP. –  Thomas Wouters 03.07.2011 в 01:46
  • вы правы, если вам нужно использовать signal.SIGKILL константу, вы должны использовать os.killpg (pgid, signal.SIGKILL), чтобы убить групповой процесс. –  Alan Shi 03.07.2011 в 07:55