2011-07-01 86 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))