我正在尝试编写以编程方式检查服务状态的代码,但对于服务名称中的拼写错误也具有鲁棒性。在我看来,一个合理的程序应该具有以下行为和语义:
- 它以单位名称作为参数
- 如果找到该单元,它会打印出服务状态并以状态 0 退出(例如活动、非活动等...)
- 如果该单位是不是找到/加载,它打印出错误并以非零状态退出
值得注意的是,这些不满足此要求:
systemctl is-active servicename
(如果设备未激活,则以非零返回状态退出,如果未加载 servicename,则行为相同)systemctl is-failed servicename
(与上面类似的行为)systemctl show servicename -pActiveState
(如果未加载 servicename,则退出状态为 0)
看起来最接近的是,systemctl show servicename -pLoadState -pActiveState
但随后我必须解析 LoadState 字符串以确定是否存在拼写错误,这似乎比这个简单任务所需的更复杂。
有什么建议么?
答案1
有什么建议么?
鼓励 systemd 人员修复 2014 年以来仍然存在的 bug。
该systemctl
手册记录了适当的 LSB 版本 3 退出状态,在 systemd 中称为EXIT_PROGRAM_OR_SERVICES_STATUS_UNKNOWN
,并且此退出状态是甚至用过对于systemctl status
不存在的服务,将其与存在但未运行的服务区分开来。
然而,它不被 所使用systemctl is-active
。
进一步阅读
- 范德布格 (2014-12-18)。
systemctl status
成功完成的服务以失败状态退出。错误#77507。 freedesktop.org。 - 伦纳特·珀特林等人。 (2017)。 ”退出状态“
systemctl
..systemd 手册页。