2012-02-02 5 views
1

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

+0

Не совсем дубликат этого (как он просто говорит, что не вызывает оболочку я искал способ, чтобы получить ребенок порожденного подпроцесса, питон породил процесс уже вызывается непосредственно): http://stackoverflow.com/questions/2638909/killing-a-subprocess-including-its-children-from-python – archgoon

ответ

1

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

+0

Вздох. Поэтому я считаю, что ответ фактически нет. Спасибо. Я посмотрю, смогу ли я избежать появления подпроцессов (или автоматически их убить). – archgoon

3

Следующая информация относится только к Unix:

Вызов os.setsid() в дочернем процессе сделает его лидером сессии новой сессии и лидер группы процессов новой process group. Отправка 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, что порождающий прекращаются.

Но если вы закомментировать

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 
+0

Спасибо, это очень помогло мне убить подпроцесс, который породил собственные процессы. – flinz

Смежные вопросы