2015-11-26 42 views
0

我正在使用MULTIPROCESSING來查找我的需求。 當我運行時,我得到一個pid(可能是父母!我不知道該怎麼稱呼它),然後與他們自己的pid和第一個進程的引用id進行協作處理。通過python腳本獲取其父pid來終止進程及其子/共同進程

現在我需要通過殺死第一個進程來殺死所有這些進程,那麼這將是最好的方式。這也是一種生活方式。

情景就像是

ps -ef |grep py 

我得到

2222 0001 first.py #0001 is os process 
    4323 2222 second.py 
    4324 2222 third.cgi 
    4324 2222 fourth.py 
    4325 2222 fifth.cgi 
    4326 2222 sixth.py 

    2223 0001 newfirst.py ############new first process from another script started 
    4327 2223 newsecond.cgi 
    4328 2223 newthird.py 
    4329 2223 newfourth.cgi 

現在我通過殺死進程(當按下停止按鈕)

kill -6 2222 ###from terminal 

那麼只有first.py正在死亡,其餘的協同程序仍在運行。當然,我可以從終端殺死其他進程,但我想以更pythonic的方式執行它(通過運行一個腳本,當有人按STOP按鈕表單前端設計運行.py文件時會觸發)

現在,我殺了first.py(因爲我不想讓它的公司運行了),我怎麼能殺死所有這些共同進程,但其他newfirst.py和它的公司不應該受到干擾。

什麼,我拿出來是這麼遠

import os 
pid = os.getpid() 
os.system('kill -9 ' + pid) 

所以如何從第一進程ID 2222濾除協同進程並殺死他們。

我也嘗試過使用psutil,但在名稱後面傳遞名稱來殺死並不是很有說服力。

我檢查了subprocess.popen方法,但失敗了,現在我不符合邏輯,請建議。

如果需要其他信息,請做評論。

+0

可以使用信號'os.killpg(pgid,sig)'來殺死進程組。在你的情況'os.killpg(pid,9)' – Kadir

回答

1

從你的問題來看,我無法理解;不過,我假設你有進程ID,例如,在你的例子中,你有進程號2222.那麼你可以試試這個:

#Assuming you have parent_pid i.e. from your example you have 2222 
pname = psutil.Process(parent_pid) 
cpid = pname.get_children(recursive=True) 
for pid in cpid: 
    os.kill(pid.pid, signal_num) #signal_num is the signal you want to send i.e. 9 as per your example 

請注意異常處理例如,在使用try - except塊來殺死它之前,檢查進程/子進程是否存在。