让 systemd 将意外退出视为失败

让 systemd 将意外退出视为失败

我将第三方可执行文件包装在 systemd 服务单元中来管理它。我无法改变这个程序的行为,而且我并不真正信任它的退出代码。我想将任何不是由 systemd 引起的退出视为失败,包括退出代码 0 或外部 SIGTERM,这样我就可以通过 systemd 的接口检测到差异。

目前我的单位看起来像:

[Unit]
Description=Foo service
Requires=bar.service
After=bar.service

[Service]
ExecStart=/opt/foo/foo -stayresident
KillMode=control-group
Restart=no

如果我手动终止服务进程,则在检查状态时我会变得“不活动”systemctl

killall foo && systemctl status foo.service

如果我将kill升级到-9,我会“失败”:

killall -9 foo && systemctl status foo.service

这是我想扩展的行为。

我知道SuccessExitStatus=服务单元设置可用于计算非零退出和其他失败类型被视为成功,但我没有看到任何相反的事情。

答案1

我可能不明白你需要什么,但也许你可以做一些简单的事情,比如在foo命令后添加失败的命令。第二个命令不会由 运行systemctl stop。例如,将 替换ExecStart

ExecStart=/bin/bash -c '/opt/foo/foo -stayresident && exit 7'

选择7只是为了让我们在状态中可以更清楚地看到它。如果foo被信号杀死,或者自行终止,则 shell 进程将继续执行并导致退出代码为 7 以及 systemd 状态为失败的。如果 asystemctl stop完成,shell 将被杀死,状态为不活跃(死亡)。仅exit 7当原始命令成功时才发生允许foo保留自然发出的任何失败信号。

请注意,为了避免killall foo也匹配bash命令,您可以使用诸如 之类的诡计bash -c '/opt/"f"oo/"f"oo ...'

相关内容