在bash脚本中测试systemd单元是否处于活动状态

21

我正在撰写一份脚本,自动在CentOS 7分发版上安装Bind服务器。

我卡在了systemctl status上,因为它没有生成错误代码(这是正确的,因为状态不是错误)我可以使用。

我想要的是检查服务是否已启动(活动状态)。最好和高效的方法是什么?


实际上,systemctl status 确实会返回状态 - 我在执行 systemctl status openvpn@<> 时发现了这一点。其中值为 0 表示正在运行,而值为 3 表示已停止。但是,该命令是交互式的 :(. 因此,@lars 建议使用 systemctl is-active,并且最好像 @palswim 建议的那样加上 -q - SACHIN GARG
2个回答

43

检查服务是否处于活跃状态的最佳方法是使用 systemctl is-active 命令:

# systemctl start sshd
# systemctl is-active sshd >/dev/null 2>&1 && echo YES || echo NO
YES
# systemctl stop sshd
# systemctl is-active sshd >/dev/null 2>&1 && echo YES || echo NO
NO

谢谢,这正是我在寻找的!看来我在手册中错过了它。^^' - math
15
你还可以使用-q开关,这样你就不需要重定向输出了:systemctl -q is-active sshd。该命令用于检查sshd服务是否正在运行。 - palswim

16

如果你想在shell脚本中进行检查,可以使用以下命令:

if (systemctl -q is-active some_application.service)
    then
    echo "Application is still running."
    exit 1
fi

要检查一个应用程序是否没有运行,只需在条件中加上一个感叹号。


这个if语句总是会被解析为true,因为字符串“active”和“inactive”都是true。 - J-a-n-u-s
脚本在我的生产机器上运行良好。如果应用程序正在运行脚本,则退出脚本,否则继续执行脚本。 - voliveira89
2
看起来脚本正在检查 systemctl 的返回代码而不是返回的字符串。所以它可以工作。 - Michael West
1
"这个if语句总是会被解析为true,因为字符串“active”和“inactive”都是true。" -> 我测试过了,对我有效。 - Eduardo Lucio
1
对于使用 -q 标志的命令,最好显式检查状态码。例如:systemctl -q is-active some_application.service\n if [ $? -eq 0 ]; then\n echo 'App running'\n exit 0\n fi - sfate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接