2017-03-07 99 views
1

如何將Ctrl-C處理或與子進程殺掉進程?我的代碼蟒蛇subprocess.Popen殺進程處理

示例(Python 2.7):

# --*-- coding: utf-8 --*-- 
import subprocess 
import os 
import signal 

proc = subprocess.Popen(['ping localhost'],shell=True,stdout=subprocess.PIPE) 
print proc.pid 

a = raw_input() 
os.killpg(proc.pid, signal.SIGTERM) 

我看下過程,當我運行程序:

user 16078 0.0 0.0 4476 916 pts/6 S+ 14:41 0:00 /bin/sh -c ping localhost 
user 16079 0.0 0.0 8628 1908 pts/6 S+ 14:41 0:00 ping localhost 

程序輸出:

16078 

的raw_input後:

Traceback (most recent call last): 
    File "subproc2.py", line 10, in <module> 
    os.killpg(proc.pid, signal.SIGTERM) 
OSError: [Errno 3] No such process 

我想殺死進程pid 16078和pid 16079.

我該怎麼做,以及程序中的錯誤?感謝幫助。

回答

1

我將如何做到這一點,有什麼錯誤的計劃?

如果你想殺死進程組中包含的所有進程,那麼你應該使用父進程ID。這樣的:

os.killpg(os.getpid(), signal.SIGTERM) 

如果你想殺死只生一個孩子的過程,然後用這個:

os.kill(proc.pid, signal.SIGTERM) 
+0

謝謝!錯誤消失,並且主進程「/ bin/sh -c ping localhost」被終止。但「ping本地主機」進程仍然存在。是否有可能殺死這兩個進程? –

+0

您與我校的腳本將產生只有一個「平」的過程,並在程序結束時它就會被殺死。殺死所有的ping進程並再次檢查。 –

+0

謝謝!代碼「os.killpg(os.getpid(),signal.SIGTERM)」爲我工作! –