我复制了下面的片段来重现我在处理SIGTERM处理程序时遇到的问题。
一个主进程,有一个SIGTERM处理程序。
一个从主进程中产生的线程
从上面的线程中产生的一个子进程。
我们的目的是了解SIGTERM处理程序的工作原理。我假设SIGTERM处理程序将被生成的线程以及进程继承。有一节是死锁发生的地方(因为共享队列没有被读取)。这使得所有的进程和线程都能保持活力,因为存在死锁。
from multiprocessing import Process, Queue
from threading import Thread
import os
import sys
import signal
def sigtermHandlerNew():
print "SIGTERM received for process: {}".format(os.getpid())
sys.exit()
def f(q):
print "f proc id: {}".format(os.getpid())
q.put('X' * 1000000)
def proc_starter():
queue = Queue()
p = Process(target=f, args=(queue,))
p.start()
p.join() # this deadlocks
obj = queue.get()
def main():
signal.signal(signal.SIGTERM, sigtermHandlerNew)
print "main process id: {}".format(os.getpid())
t = Thread(target=proc_starter)
t.start()
t.join()
main()
在我运行这个程序后,我将有2个进程在运行。我观察到一个奇怪的行为--当我试图使用SIGTERM()杀死任何一个进程时。$ kill -15 <proc-id>
),我看到SIGTERM处理函数没有被调用,这个死锁永远存在(直到我发出SIGKILL信号)
谁能帮我理解一下为什么信号没有被进程认可?你可以直接运行这个片段。