2012-02-02 66 views
1

python是否提供了一種方法來查找使用子流程產生的兒童流程子女,以便我可以正確殺死他們?如果不是,確保孩子的孩子死亡的好方法是什麼?用子流程來扼殺兒童的蟒蛇兒童

+0

不完全是這個副本(因爲它只是說不要調用shell。我正在尋找一種方法來獲取衍生子進程的子節點,python衍生進程是已經被直接調用):http://stackoverflow.com/questions/2638909/killing-a-subprocess-including-its-children-from-python – archgoon 2012-02-02 18:15:00

回答

1

不太容易,但如果您的應用程序在Linux上運行,你可以通過/ proc文件系統走,並建立其PPID所有PID的清單(父PID)相同的子。

+0

感嘆。所以我認爲答案是沒有。謝謝。我會看看是否可以避免子進程派生(或自動殺死它們)。 – archgoon 2012-02-02 20:54:14

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.setsidls -laR和產生它仍在運行的外殼。一定要殺死他們:

% kill 5409 
% kill 5410 
+0

謝謝,這幫助我消滅了一個產生自己進程的子進程。 – flinz 2016-04-08 08:54:32