【发布时间】:2013-11-28 02:48:30
【问题描述】:
我有连续运行的 python 代码(收集传感器数据)。它应该在启动时使用start-stop-daemon 启动。但是,我希望能够优雅地终止进程,所以我从How to process SIGTERM signal gracefully? 帖子中的建议开始,并将我的主循环放在一个单独的线程中。我希望能够在它作为守护进程运行时优雅地关闭它(start-stop-daemon 将发送一个终止信号)以及当我短暂启动它以自己在终端中进行测试时(我按下 ctrl-c) .
但是,如果我终止进程,似乎不会调用信号处理程序(即使不使用线程,“done (killed)”也不会出现在我重定向到的文件中)。当我按下ctrl-c 时,收集将继续并在终端中(或我重定向到的文件)保持打印数据。
我在下面的代码中做错了什么?
from threading import Thread
import time, sys, signal
shutdown_flag = False #used for gracefull shutdown
def main_loop():
while not shutdown_flag:
collect_data() # contains some print "data" statements
time.sleep(5)
print "done (killed)"
def sighandler(signum, frame):
print 'signal handler called with signal: %s ' % signum
global shutdown_flag
shutdown_flag = True
def main(argv=None):
signal.signal(signal.SIGTERM, sighandler) # so we can handle kill gracefully
signal.signal(signal.SIGINT, sighandler) # so we can handle ctrl-c
try:
Thread(target=main_loop, args=()).start()
except Exception, reason:
print reason
if __name__ == '__main__':
sys.exit(main(sys.argv))
【问题讨论】:
标签: python multithreading sigterm