我的服务器上运行着一个备份守护进程,它每隔几天就会崩溃一次。我不知道为什么。从长远来看,我想找出原因并修复它,但同时我希望 systemd 在崩溃时重新启动它。
它有一个老式的 SysV 初始化脚本,它被 systemd-sysv-generator 接收。显然,当它崩溃时,它会使用零(“成功”)退出代码。为了尝试在这些崩溃后重新启动它,我输入了一个override.conf:
~$ cat /etc/systemd/system/crashplan.service.d/override.conf
[Service]
Restart=always
Run Code Online (Sandbox Code Playgroud)
systemd 似乎正在解决这个问题:
roberts:~$ sudo systemctl show crashplan.service | grep Restart
Restart=always
RestartUSec=100ms
Run Code Online (Sandbox Code Playgroud)
尽管如此,当我在几天后检查它时,我发现:
roberts:~$ sudo systemctl status crashplan.service
? crashplan.service - LSB: CrashPlan Engine
Loaded: loaded (/etc/init.d/crashplan; bad; vendor preset: enabled)
Drop-In: /etc/systemd/system/crashplan.service.d
??override.conf
Active: active (exited) since Thu 2017-01-05 00:33:50 PST; 5 days ago
Docs: man:systemd-sysv-generator(8)
Jan 05 00:33:50 roberts systemd[1]: Stopped LSB: CrashPlan Engine.
Jan 05 00:33:50 roberts systemd[1]: Starting LSB: CrashPlan Engine...
Jan 05 00:33:50 roberts crashplan[25491]: Starting CrashPlan Engine ... Using standard startup
Jan 05 00:33:50 roberts crashplan[25491]: OK
Jan 05 00:33:50 roberts systemd[1]: Started LSB: CrashPlan Engine.
Run Code Online (Sandbox Code Playgroud)
所以... systemd 似乎认为它没有运行,这很酷?没有日志表明它甚至试图重新启动它?我什至不知道如何判断它何时崩溃。这里发生了什么?
当 init.d 脚本未指定 PID 文件时,其自动生成的单元具有RemainAfterExit=yes. 在大多数情况下,此类脚本代表没有长时间运行进程的一次性任务,因此即使在进程退出后,此选项也会使此类单元显示为“活动”。
这允许管理员手动“停止”这样的单元(例如“启动”/etc/init.d/iptables 加载防火墙规则,“停止”它会刷新它们)。但是,由于该单元始终处于“活动状态”,这意味着永远不会触发重新启动逻辑。(毕竟,是没什么可重新启动。)
这里的解决方案是为 CrashPlan 编写一个原生的 systemd .service 文件——或者至少让守护进程生成一个 pidfile 并相应地添加# pidfile: /run/...到 initscript。
...或者,首先运行systemctl cat crashplan.service以查看完整的单元内容,然后手动撤消所有错误参数:RemainAfterExit、GuessMainPID 等。
另请参阅提交f87883039和文件sysv-generator.c 第 197 行。
| 归档时间: |
|
| 查看次数: |
4234 次 |
| 最近记录: |