我想要 grep 某个服务的特定状态(tomcat8.service
)。
只有找到字符串时我才想执行一些逻辑。
问题:即使我在不存在的服务名称上执行脚本(本例中为“asd”),if $status
仍然匹配并打印出来。但为什么呢?
status = $(systemctl status asd.service | grep 'active')
echo $status
if $status
then
echo "$SERVICE was active"
exit 0
fi
exit 0
结果输出为:asd.service was active
,这当然不是真的。
印刷品echo $status
:status: Unknown job: =
答案1
您可以利用 grep 的返回状态。
systemctl status asd.service | grep 'active' \
&& status=active \
|| status=not_active
if [ "$status" == "active" ]; then
[...]
fi
甚至更简单:
test $(systemctl status asd.service | grep 'active') \
&& echo "$SERVICE was active"
或者如果你愿意if
:
if $(systemctl status asd.service | grep 'active'); then
echo "$SERVICE was active"
fi
无论如何,请注意关键词inactive
、not active
或active (exited)
alike。这也会与您的grep
陈述相匹配。请参阅评论。感谢@Terrance 的提示。
更新:
不需要 grep。systemctl
已包含命令is-active
。
systemctl -q is-active asd.service \
&& echo "$SERVICE was active"
或者:
if systemctl -q is-active asd.service; then
echo "is active";
fi
答案2
一些代码审查意见:
- sh/bash/ksh/zsh 变量分配看起来像
var=value
——不允许周围=
有空格。(文档) status=$(some command)
-- 状态变量保存输出命令的退出状态,而不是退出状态。退出状态在$?
变量中声明
if
作用于后续命令的退出状态(文档)if some_comment; then action1; else action2; fi
最常见的是,命令是
[
或[[
测试某些条件。但是,
grep
有一个明确的退出状态:如果找到了模式,则为 0,否则为 1。因此,您需要以下状态:if systemctl status asd.service | grep -q 'active'; then echo "$SERVICE was active" fi