如果我在脚本中执行此操作,则状态调用将显示“OK”
- systemctl 启用 foo
- systemctl 启动 foo
- systemctl 状态 foo
但仅几毫秒之后,状态就变成“失败”。
我如何检测启动是否成功?
对我来说,“成功”的含义是:服务器开始运行。
Systemd 开始启动该过程,并不等待查看服务器是否能够正确启动。
示例:服务器配置包含语法错误。服务器将运行几毫秒,然后终止。
最简单的解决方案是在调用“systemctl status foo”之前执行“sleep 1”。
但这感觉很脏。
也许有更好的解决方案来获取启动服务器后的真实状态。
我只关心启动。如果服务器在两小时后出现故障,则这不是问题的一部分。
答案1
通常,在以下情况下,您会failed
在命令输出中看到已启动进程的状态:
- 进程退出时状态
status
不等于0
或不同于SuccessExitStatus
单元文件[Service]
部分中指定的参数 - 向守护进程发送不干净的信号(杀死等)
- 启动守护进程时的超时时间,可以通过
TimeoutStartSec
或进行设置TimeoutSec
,默认值为DefaultTimeoutStartSec
,通常为 90 秒,或者按照system.conf
,[Manager]
部分中的设置 - 看门狗(当 时
type=notify
),同上,由 控制WatchdogSec
,RuntimeWatchdogSec
服务必须定期使用“WATCHDOG=1”(即“keep-alive ping”)调用 sd_notify(3)。如果两次此类调用之间的时间大于配置的时间,则服务将处于失败状态
type
单元文件中设置不正确猜测主PID
采用布尔值,指定如果无法可靠地确定服务的主 PID,systemd 是否应该尝试猜测。除非设置了 Type=forking,否则此选项将被忽略并且 PIDFile= 未设置,因为对于其他类型或使用明确配置的 PID 文件,主 PID 始终是已知的。如果守护进程由多个进程组成,猜测算法可能会得出错误的结论。如果无法确定主 PID,服务的故障检测和自动重启将无法可靠地进行。默认为是。