Убийство детей детей в python с помощью подпроцесса - PullRequest
1 голос
/ 02 февраля 2012

Предоставляет ли python способ поиска дочерних процессов, порожденных с помощью подпроцесса, чтобы я мог их правильно убить?Если нет, то как можно убить детей ребенка?

Ответы [ 2 ]

3 голосов
/ 23 мая 2013

Следующее относится только к Unix:

Вызов os.setsid () в дочернем процессе сделает его лидером сеанса нового сеанса и лидером группы процессов нового группа процессов .Отправка SIGTERM в группу процессов отправит SIGTERM всем подпроцессам, которые мог порождать этот дочерний процесс.

Вы можете сделать это, используя subprocess.Popen(..., preexec_fn=os.setsid).Например:

import signal
import os
import subprocess
import time
PIPE = subprocess.PIPE
proc = subprocess.Popen('ls -laR /', shell=True,
                        preexec_fn=os.setsid,
                        stdout=PIPE, stderr=PIPE)
time.sleep(2)
os.killpg(proc.pid, signal.SIGTERM)

Выполнение этой команды не будет отображать вывод, но ps ax покажет подпроцесс и ls -laR, что он запускается, завершается.

Но если вы закомментируете1017 *

preexec_fn=os.setsid

тогда ps ax покажет что-то вроде

% ps ax | grep "ls -la"
 5409 pts/3    S      0:00 /bin/sh -c ls -laR /
 5410 pts/3    R      0:05 ls -laR /

Так что без os.setsid, ls -laR и оболочки, которая его породила, все еще работает.Обязательно убей их:

% kill 5409
% kill 5410
1 голос
/ 03 февраля 2012

Не совсем просто, но если ваше приложение работает в Linux, вы можете пройти через файловую систему / proc и создать список всех PID, чей PPID (родительский PID) совпадает с вашим подпроцессом '.

...