テスト結果を変数にインポートするbashスクリプト

テスト結果を変数にインポートするbashスクリプト

私は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

関連情報