【问题标题】:How to properly handle and retain system shutdown (and SIGTERM) in order to finish its job in Python?如何正确处理和保留系统关闭(和 SIGTERM)以完成其在 Python 中的工作?
【发布时间】:2011-12-23 14:51:57
【问题描述】:

基本需求:我有一个 Python 守护程序,它通过 os.system 调用另一个程序。我的愿望是能够正确处理系统关闭或SIGTERM,以便让被调用的程序返回然后退出。

我已经尝试过:我尝试过使用信号的方法:

import signal, time

def handler(signum = None, frame = None):
    print 'Signal handler called with signal', signum
    time.sleep(3)
    #here check if process is done
    print 'Wait done'

signal.signal(signal.SIGTERM , handler)

while True:
    time.sleep(6)

time.sleep 的用法似乎不起作用,并且从未调用过第二次打印。

我读过一些关于 atexit.register(handler) 而不是 signal.signal(signal.SIGTERM, handler) 的文章,但 kill 时没有调用任何内容。

【问题讨论】:

  • 我复制了你的代码,它工作得很好。你用的是什么版本的python等等?
  • 您的代码似乎有效。你得到的输出/行为是什么?
  • 等一下,我收集你需要的东西。
  • 确实......它有效,我重构了我的代码将它放在那里我删除了一些我认为会导致问题的行--->关闭问题。不过谢谢!
  • 我认为最好对这一点给出答案。你们中的一个人可以发布这个答案,以便我可以勾选它。

标签: python unix


【解决方案1】:

您的代码几乎可以正常工作,只是您在清理后忘记退出。

我们经常需要捕获各种其他信号,例如 INT、HUP 和 QUIT,但对于守护进程来说就不需要了。

import sys, signal, time

def handler(signum = None, frame = None):
    print 'Signal handler called with signal', signum
    time.sleep(1)  #here check if process is done
    print 'Wait done'
    sys.exit(0)

for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]:
    signal.signal(sig, handler)

while True:
    time.sleep(6)

在许多系统上,普通进程在关机期间没有太多时间进行清理。为了安全起见,您可以write an init.d script 停止您的守护进程并等待它。

【讨论】:

  • 感谢您提供有趣的开发答案并导致此 init.d 脚本文档。
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多