【问题标题】:Properly exit python script on systemctl stop service在 systemctl stop 服务上正确退出 python 脚本
【发布时间】:2018-09-03 19:07:12
【问题描述】:

当按下 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 时我是否需要注意正确的线程退出,或者它会很好地处理我的脚本?

【问题讨论】:

    标签: python exception try-catch exit


    【解决方案1】:

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

    至于其他线程,这取决于它们的关键程度以及它们的实例化方式。如果它们被实例化为守护进程,并且在任何给定时间简单地终止它们没有任何后果,你可以让它们死掉。否则,您应该明确编码逻辑以在收到信号时正确关闭它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多