signal.signal在子进程结束时收到sigint / sigterm

时间:2015-02-19 09:44:17

标签: python process signals

我有以下简化示例:

#!/usr/bin/python

import logging, logging.handlers
from multiprocessing import Process, Queue
import time, sys, signal

def child_proc(sleepr):

    print 'Child: Started child, waiting'
    time.sleep(sleepr)
    print 'Child: Ended sleep, exiting' 

def cleanup(a, b):
    print 'Main: Got SIGTERM: ' + str(a) + ' : ' + str(b)

print 'Main: Starting process'
child_proc_th = Process(target=child_proc, args=(3,))
child_proc_th.start()

print 'Main: Pausing main thread'
signal.signal(signal.SIGTERM, cleanup)
signal.pause()

print 'Main: Running again after pause'

为什么在child_proc完成后signal.pause会恢复?如果收到sigterm,我只希望它恢复... child_proc是否将堆栈的退出信号发送到父进程?还是有另一种方法可以做到这一点......?

TIA

1 个答案:

答案 0 :(得分:0)

signal.pause()阻止,直到收到任何信号。当孩子退出时,它会向父母发送SIGCHLD。这会导致signal.pause()返回。

据我所知,为了达到你想要的效果,你必须在循环中signal.pause(),直到收到正确的信号。

这样的事情:

sigtermreceived = False

def sigterm(signum, frame):
  global sigtermreceived
  sigtermreceived = True

signal.signal(signal.SIGTERM, sigterm)

while not sigtermreceived:
  signal.pause()

请注意,还有Process.join()

child_proc_th = Process(target=child_proc, args=(3,))
child_proc_th.start()
child_proc_th.join()

这将阻止子进程退出。这基本上就是你现在的行为,但没有弄乱信号。