2011-07-01 361 views

回答

27

當傳遞一個 PID到kill,它實際上將信號發送到處理由(絕對)數。你在Python中使用os.killpg()

-1

您應該使用信號參數9來終止進程樹。
根@本地:〜$蟒蛇
> > >進口OS
> > > os.kill(PID,9)

如果你要使用signal.SIGKILL常數,你應該使用os.killpg(PGID ,signal.SIGKILL)來終止進程樹。

+0

編號'signal.SIGKILL'是正確的常數使用。 –

+0

os.kill(pid,9)適用於我,我在centos上使用python 2.7 5.6 –

+3

是的,'os.kill(pid,9)'適用於'signal.SIGKILL'碰巧是'9',這就是在大多數平臺上。儘管如此,'signal.SIGKILL'是正確的使用常數,並且使用'9'代替'signal.SIGKILL'並不是一種改進,也不以任何方式解決OP的問題。 –

11

如果父進程不是「進程組」但您想要與子進程關閉,則可以使用psutil(https://pythonhosted.org/psutil/#processes)。 os.killpg無法識別非進程組的pid。

import psutil 

parent_pid = 30437 # my example 
parent = psutil.Process(parent_pid) 
for child in parent.children(recursive=True): # or parent.children() for recursive=False 
    child.kill() 
parent.kill() 
4

另一種解決方法,如果你的過程不是一個進程組,你不想psutil使用,是運行這個shell命令:

pkill -TERM -P 12345 

例如與

os.system('pkill -TERM -P {pid}'.format(pid=12345))