我正在尝试使用 systemd 计时器和服务设置进程的自动执行。问题是我的一次性服务在关闭时立即被终止。我如何告诉 systemd 不要终止 oneshot 服务,而是等待它完成后再关闭?
我的 test.service 看起来像这样:
[Unit]
Description=My automatic updates
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/sleep 40
TimeoutSec=0
答案1
所以我找到了两种可能的解决方案。
告诉您的脚本忽略 TERM 信号并设置
TimeoutStopSec=infinity
为避免 systemd SIGKILL 您的进程在不响应 SIGTERM 后。忽略 TERM 信号可以通过trap
在 bash 中使用或在 Python 中使用类似的命令来完成:import signal def signal_handler(signum, frame): pass signal.signal(signal.SIGTERM, signal_handler)
您应该实现一个逻辑,以便在收到 TERM 信号时尽快退出脚本。
如果您无法修改可执行文件,请设置
KillSignal=
为非破坏性的内容SIGCONT
(我认为这是一种黑客行为,不推荐这样做)。