在systemctl停止服务上正确退出python脚本

时间:2018-03-25 16:04:46

标签: python exception try-catch exit

我的脚本在按下CTLC + C时通过except KeyboardInterrupt退出,如下所示:

....

try:
    thread1.start()
    thread2.start()
    while True:
        time.sleep(1)

except (KeyboardInterrupt, SystemExit, Exception):
    print("exiting")
    # handle proper threads exit

但是,当脚本以systemd身份运行并且我调用systemctl stop myscript.service时,'exiting'消息未记录到syslogger中,因此我知道except未执行。似乎没有在服务停止时发布SystemExitException。 systemctl发布了什么,所以我可以在我的脚本的try - except部分中捕获它?

另外,在调用systemctl stop时是否需要关注正确的线程退出,否则它会很好地处理我的脚本?

1 个答案:

答案 0 :(得分:0)

您可以在systemd配置文件中指定KILL_MODE选项,该选项指定向进程发送什么信号以退出该信号。然后,您可以使用signal模块修改python脚本以捕获指定的信号,并相应地执行退出代码。

对于其他线程,这取决于它们的关键程度和实例化方式。如果将它们实例化为守护程序,并且在任何给定时间仅终止它们都没有任何后果,则可以让它们死亡。否则,您应该明确编码逻辑以在收到信号后将其正确关闭。