我将第三方可执行文件包装在 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 ...'
。