サービスの特定のステータス(Tomcat8.service
)をgrepしたい。
文字列が見つかった場合にのみ、いくつかのロジックを実行します。
問題:存在しないサービス名(この例では「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: =
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)
などに注意してください。これは、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
コードレビューのコメント:
var=value
のように見えます-=
の周りにスペースを入れることはできません。 ( ドキュメント )status=$(some command)
-ステータス変数は、終了ステータスではなく、コマンドのoutputを保持します。終了ステータスは$?
変数にありますif
ステートメントは、次のコマンドの終了ステータスに作用します(- documentation )
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