![在脚本中检测 systemd 单元是否已加载/可用?](https://linux22.com/image/779986/%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%A3%80%E6%B5%8B%20systemd%20%E5%8D%95%E5%85%83%E6%98%AF%E5%90%A6%E5%B7%B2%E5%8A%A0%E8%BD%BD%2F%E5%8F%AF%E7%94%A8%EF%BC%9F.png)
如果我为不存在的服务(foo.service
)(例如systemctl stop foo.service
)运行 systemctl 命令,systemd 将失败(退出代码 5,&stderr: Failed to stop foo.service: Unit foo.service not loaded.
)。
在我的 bash 脚本中,在运行命令之前,是否可以检测出服务(或.timer
)是否会失败systemctl
?systemd 有systemctl is-active NAME.service
。没有systemctl is-loaded
。检测这种情况的最佳方法是什么systemctl list-units
???systemctl status
try-restart
我正在编写一个重新启动(好吧)a.timer
或 的脚本.service
。如果计时器不存在,我不希望发生错误。如果计时器存在,和这try-restart
失败,我想检测并提出该错误。
最新 Ubuntu LTS(例如 20.04)上的 systemd v245 等
答案1
systemctl status
将退出并返回指示服务状态的返回代码。从手册页中:
Value Description in LSB Use in systemd
0 "program is running or service is OK" unit is active
1 "program is dead and /var/run pid file exists" unit not failed (used by is-failed)
2 "program is dead and /var/lock lock file exists" unused
3 "program is not running" unit is not active
4 "program or service status is unknown" no such unit
返回代码4
表示未知服务(如果您尝试重新启动该服务,则会导致错误)。
但从您的问题来看,您似乎可以跳过检查,只使用返回代码systemctl restart
(如果 rc=5,则忽略错误,否则显示错误并处理失败等)。