私はBashスクリプトを学ぶことを試みており、ただ楽しく監視するスクリプトを書くことを望みましたhttpd.service
。
基本構造は次のとおりです。
#!/bin/bash
SERVICE=httpd.service
if [ "systemctl show -p ActiveState $SERVICE | sed 's/ActiveState=//g'" != "active" ] && [ "systemctl show -p SubState $SERVICE | sed 's/SubState=//g'" != "running" ]
then
echo "$SERVICE is inactive" | mailx -r [email protected] -s "$SERVICE not running on $HOSTNAME" [email protected]
fi
効果がある安全なベストプラクティスで書かれていますか?そうではないようです。しかし、今回は2日目なので、まずスクリプトの後ろに隠されたアイデアを全体的に理解する必要があります。
test
ステータスとサブステータスをメールに印刷できるように、変数から2つの条件の結果をどのように取得できますか?私は次のようにできると思います。
#!/bin/bash
SERVICE=httpd.service
STATE=$(systemctl show -p ActiveState $SERVICE | sed 's/ActiveState=//g')
SUBSTATE=$(systemctl show -p SubState $SERVICE | sed 's/SubState=//g')
if [ "$STATE" != "active" ] && [ "SUBSTATE" != "running" ]
then
echo "$SERVICE state is $STATE and substate is $SUBSTATE"
fi
しかし、これがエレガントなアプローチであるかどうかはわかりませんか?
編集する
貴重なフィードバックをありがとうございます!私はそれらすべてに投票しました!
それで基本的に私はこうしました。
#!/bin/bash
SERVICE=httpd.service
HOST=$(grep '^ServerName' /etc/httpd/conf/httpd.conf | sed 's/^.* //')
[email protected]
if [ "$(systemctl show -p ActiveState $SERVICE | sed 's/ActiveState=//g')" = "active" ]
then
echo "$SERVICE is running" >/dev/null
else
systemctl restart $SERVICE 2>/dev/null
if [ "$(systemctl show -p ActiveState $SERVICE | sed 's/ActiveState=//g')" = "active" ]
then
echo "$SERVICE on $HOST has been started" | mailx -r "${HOST}"@blabla.com -s "$SERVICE on $HOST restarted" $EMAIL
else
echo "$SERVICE on $HOST is stopped and could not be started!" | mailx -r "${HOST}"@blabla.com -s "$SERVICE on $HOST has encountered a problem!" $EMAIL
fi
fi
見ていただけますか? POSIXと互換性のないスタイルが使用されますか?
答え1
最初のスクリプトは機能しません。
if [ "$(cmd)" != "active" ]
変える
if [ "cmd" != "active" ]
2番目のスクリプトはよさそうです。
それらと一緒に使用される否定的な条件に注意してください&&
。希望の結果が得られない場合があります。私の考えでは、あなたが||
代わりにしたいと思います&&
。
ここでは交換g
オプションは必要ありませんが、sed
悪いことはありません。
ただし、統合機能を使用すると、よりエレガントになりますsystemctl
。
systemctl is-enabled httpd.service >/dev/null || echo "Service not enabled"
systemctl is-active httpd.service >/dev/null || echo "Service not active"
systemctl is-failed httpd.service >/dev/null && echo "Service is failed"
答え2
@RoVoが言ったように、ロジックに注意してください。欲しいかもしれません
if [[ ! ("$STATE" = "active" && "SUBSTATE" = "running") ]]
bashの使用に注意してください[[ ... ]]
またはより携帯可能
case "$STATE,$SUBSTATE" in
"active,running") echo ok ;;
*) echo not ok ;;
esac