【发布时间】:2016-04-24 18:41:21
【问题描述】:
我在 Raspbian 上使用 systemd 来运行 Python 脚本 script.py。 my.service 文件如下所示:
[Unit]
Description=My Python Script
Requires=other.service
[Service]
Restart=always
ExecStart=/home/script.py
ExecStop=/home/script.py
[Install]
WantedBy=multi-user.target
当Required=other.service 停止时,我希望my.service 立即停止并终止运行script.py 的Python 进程。
但是,当通过停止 other.service 然后使用 systemctl 监视 my.service 的状态来尝试此操作时,my.service 似乎需要很长时间才能实际输入“失败'状态(停止)。似乎调用ExecStop 到脚本 不足以终止my.service 本身和随后的script.py。
更清楚一点:我希望脚本以类似于 Ctrl + C 的方式结束立即。基本的 Python 清理工作还可以,但我不希望 systemd 等待“正常”响应超时或类似情况。
问题:
- 我对延迟的解释是正确的,还是只是
systemctl更新其状态概览的速度很慢? - 停止服务和终止脚本的推荐方法是什么。我应该在 Python 脚本中包含某种
SIGINT捕获吗?如果是这样,怎么做?或者有什么可以在my.service中做的事情来加快服务的停止和脚本的杀戮?
【问题讨论】:
-
你试过用
BindsTo代替Requires吗? -
@DougLuce 总的来说,这看起来是个不错的建议。但是我现在试了一下,
systemctl的状态还是my.service loaded deactivating stop至少一分钟才变成loaded failed failed -
这里不是主题。
-
@black 我不这么认为,尤其是如果在 Python 中捕获 SIGINT 是必需的方法。
-
问题主要不是这个,这就是为什么它离题了。处理 SIGINT 会是,但它是次要的,除了几乎肯定已经讨论过。
标签: python linux systemd sigint