在脚本中检测 systemd 单元是否已加载/可用?

在脚本中检测 systemd 单元是否已加载/可用?

如果我为不存在的服务(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,则忽略错误,否则显示错误并处理失败等)。

相关内容