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

signal.signal receives sigint/sigterm when child process ends

我有以下简化示例:

#!/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'

为什么 signal.pause 在 child_proc 完成后继续?我只希望它在收到 sigterm 时恢复... child_proc 是否将其退出信号向上发送到父进程?或者有其他方法可以做到这一点...?

TIA

signal.pause() blocks until any signal is received. When a child exits it sends SIGCHLD 到 parent。这导致 signal.pause() 到 return。

据我所知,要实现您想要的效果,您必须 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()

这将阻塞,直到 child 进程退出。这基本上就是您现在的行为,但不会干扰信号。