通过信号杀死子进程,但位置影响?

时间:2016-02-10 06:27:23

标签: python linux

我使用signal函数来杀死mul-process程序中的所有子进程,代码显示为blow,保存为名为mul_process.py的文件:

import time
import os
import signal
from multiprocessing import Process

processes = []

def fun(x):
    print 'current sub-process pid is %s' % os.getpid()
    while True:
        print 'args is %s' % x
        time.sleep(100)

def term(sig_num, frame):
    print 'terminate process %d' % os.getpid()
    for p in processes:
        print p.pid
    try:
        for p in processes:
            print 'process %d terminate' % p.pid
            p.terminate()
            p.join()
    except Exception as e:
        print str(e)

if __name__ == '__main__':
    print 'current main-process pid is %s' % os.getpid()
    for i in range(3):
        t = Process(target=fun, args=(str(i),))
        t.start()
        processes.append(t)
    signal.signal(signal.SIGTERM, term)
    try:
        for p in processes:
            p.join()
    except Exception as e:
        print str(e)

使用' python mul_process.py'在Ubuntu 10.04.4和Python 2.6上启动程序,当它开始运行时,在另一个选项卡中,我使用kill -15与主进程pid发送信号SIGTERM以终止所有进程,当主进程收到信号SIGTERM时,它在终止所有子进程后退出,但是当我使用kill -15和子进程pid时,它不起作用,程序仍然活着并且像以前一样运行,并且不打印函数术语中定义的句子,似乎是子进程没有收到SIGTERM。据我所知,子进程将继承信号处理程序,但它不起作用,这是第一个问题。

然后我移动线' signal.signal(signal.SIGTERM,term)'如果名称 ==' 主要':',就像这样:

if __name__ == '__main__':
    signal.signal(signal.SIGTERM, term)
    print 'current main-process pid is %s' % os.getpid()
    for i in range(3):
        t = Process(target=fun, args=(str(i),))
        t.start()
        processes.append(t)
    try:
        for p in processes:
            p.join()
    except Exception as e:
        print str(e) 

启动程序,并使用kill -15与主进程pid发送信号SIGTERM,程序接收信号并调用函数term但也不杀死任何子进程并退出自己,这是第二个问题。

1 个答案:

答案 0 :(得分:1)

程序中几乎没有问题 - 同意子进程将继承第二个代码片段中的信号处理程序,但不会共享全局变量“进程”列表。因此,仅主流程可以使用流程列表。 “进程”将是其他子进程的空列表。 您可以使用队列或管道类型的机制将进程列表传递给子进程。但它会带来另一个问题

您终止process1并且process1的处理程序尝试将process2终止为process4。

现在,进程2也有相同的处理程序,

So Process 2 handler again try to terminate all other process

将推动您的程序进入无限循环。