【问题标题】:signal.signal receives sigint/sigterm when child process endssignal.signal 在子进程结束时接收 sigint/sigterm
【发布时间】:2023-03-16 10:51:01
【问题描述】:

我有以下简化示例:

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

【问题讨论】:

    标签: python process signals


    【解决方案1】:

    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()
    

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

    【讨论】:

    • 谢谢。但是,如果 signal.SIGTERM 不仅寻找正确的信号(在本例中为 SIGTERM),那么它有什么相关性......?现在看 SIGCHLD...
    • 您似乎对信号的工作方式有误解。无论您是否安装了自定义处理程序,都会发生信号。信号是系统的一部分。 python 只是提供了一个接口来处理它们。阅读维基百科文章了解更多en.wikipedia.org/wiki/Unix_signal
    • 我相信这就是他在这里所描述的......基本上只是通过处理程序确保已捕获正确的信号,如果不是“重新暂停”。没有?
    • 仅供参考,这解决了我的问题,谢谢。我没有意识到 signal.pause 会在收到任何信号时触发,并且只有在捕获到所述信号时才会触发处理程序。
    • 仅供参考,这解决了我的问题,谢谢。我没有意识到 signal.pause 会在收到任何信号时触发,并且只有在捕获到所述信号时才会触发处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2019-05-05
    • 2011-10-11
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多