假设我们有一个用python编写的小守护进程:
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
我们使用start-stop-daemon
对其进行守护,默认情况下,它在--stop
上发送SIGTERM
(TERM
)信号。
假设当前执行的步骤是#2
。此时此刻,我们正在发送TERM
信号。
发生的情况是执行立即终止。
我发现我可以使用signal.signal(signal.SIGTERM, handler)
处理信号事件,但问题是它仍然会中断当前的执行并将控件传递给handler
。
所以,我的问题是-是否可以不中断当前的执行,而是在一个分离的线程中处理TERM
信号这样我就可以设置shutdown_flag = True
以便mainloop()
有机会优雅地停止?
基于类的清洁使用解决方案:
我想你已经接近一个可能的解决办法了。
在单独的线程中执行
mainloop
,并使用属性shutdown_flag
扩展它。信号可以用主线程中的signal.signal(signal.SIGTERM, handler)
捕获(而不是在单独的线程中)。信号处理程序应将shutdown_flag
设置为True,并等待线程以thread.join()
结束首先,我不确定是否需要第二个线程来设置shutdown_标志。为什么不直接在SIGTERM处理程序中设置它呢?
另一种方法是从
SIGTERM
处理程序引发异常,该异常将在堆栈中传播。假设您已经得到了正确的异常处理(例如使用with
/contextmanager
和try: ... finally:
块),这应该是一个相当优雅的关闭,类似于您要Ctrl-C
您的程序。示例程序
signals-test.py
:现在看看Ctrl-C的行为:
这次我用
kill $(ps aux | grep signals-test | awk '/python/ {print $2}')
在4次迭代后发送它SIGTERM
:这次我启用了自定义的
SIGTERM
处理程序并发送它SIGTERM
:相关问题 更多 >
编程相关推荐