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 进程退出。这基本上就是您现在的行为,但不会干扰信号。
我有以下简化示例:
#!/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 进程退出。这基本上就是您现在的行为,但不会干扰信号。