Systemd 在处理 .service 文件时,能够执行 ExecStartPre 和 ExecStartPost 子句中的脚本。这些脚本可以将值返回给 systemd。
在 systemd 的文档中,它表明除了 0 之外的任何返回值都被视为失败,除非该子句带有前缀“-”,否则表明启动服务的尝试将被中止。
中止的启动尝试没什么大不了的,因为 systemd 只会重新尝试启动该服务,除非该服务被标记为简单(我认为)。
在我继承的脚本中,作者指出返回值 111 通知 systemd 不仅应该中止启动,而且不再尝试进一步启动。在其他地方,除了更典型的 0 之外,脚本还会有条件地返回 10 或 11。这些返回条件似乎是脚本功能不可或缺的一部分。
我找不到任何描述 systemd 对这些返回代码的解释的信息。
答案1
您可以选择主ExecStart
命令。我不知道,但怀疑-Post
并不-Pre
要使用那些。
接受 10 和 11 为有效:成功退出状态=
将 111 视为彻底破坏交易的因素:重新启动阻止退出状态=
否则,您始终可以编写一个快速包装 shell 脚本来缓解缺少systemd 中的支持。
我会做这样的事情:
#!/bin/sh
if [ -f /run/my-script-is-dead ]
then
# to avoid very fast loop, sleep for a bit
sleep 10
exit 1
fi
# Run the script itself
/path/and/usual-command
# check result
RESULT=$?
if [ $RESULT -eq 10 ] || [ RESULT -eq 11 ]
then
exit 0
fi
if [ $RESULT -eq 111 ]
then
touch /run/my-script-is-dead
exit 1
fi
exit $RESULT
但是把文件放在下面/run
,它会自动消失每次重新启动时。如果你想要更永久的东西,那么你必须在其他地方创建一个文件(即/var/cache/...
)