systemctlの特定の出力を処理する方法は?

systemctlの特定の出力を処理する方法は?

私はbash / shellスクリプトの初心者であり、特定のサービスが見つからないときにsystemctlの特定の出力を処理しようとしています。たとえば、systemctl status xyz返された出力を実行してもUnit xyz could not be found.サービスが見つからない場合は、文字列を保持するように変数を更新したいと思いますServiceName="xyz service not found"。変数をまったく更新したくないので、サービスが見つかったら変更せずに残します。

これは、特定のサービスが実行されていることを確認し、s3に送信されたcsvファイルに変数出力を保存し、aws Athenaを介してバケットを照会できるようにするための努力の一部です。 (追加情報を提供するためにすでにこれを実装しています。)

これまで私は試しました

#!/usr/bin/env bash
serviceName=$(systemctl status xyz | head -n 1 | cut -c 3-)

if [[ $serviceName$(systemctl status xyz | grep 'could not be found') ]]; then
        serviceName="xyz not found"
else
        serviceName=$(systemctl status xyz | head -n 1 | cut -c 3-)
fi

bash test.sh(提供されたコードを含むファイル名)を実行すると返されます。

Unit xyz could not be found.
Unit xyz could not be found.
Unit xyz could not be found.

私は別のコマンドを使ってこのコマンドを実行しているので、失敗したときにスクリプト全体を終了したくありません。

よろしくお願いします。

ベストアンサー1

実行すると、systemctl status someservice次の終了ステータスが返されることがあります。

LSBの説明 システムで使用
0 「プログラムが実行中かサービスが正常です」 デバイスがアクティブです。
1 「プログラムが終了しました。/var/run pidファイルが存在します」 デバイスは失敗しませんでした(is-failedで使用されています)。
2 "プログラムが終了しました。/var/lock ロックファイルが存在します。" 未使用
サム 「プログラムが実行されていません」 デバイスがアクティブではありません。
4 「プログラムやサービスの状態が不明」 そのようなユニットはありません。

したがって、この場合、4終了ステータスに興味があります。その後、次のスクリプトを使用できます。

systemctl status xyz

if [ "$?" -eq 4 ]; then
   serviceName="xyz service not found"
fi

しかし、あなたの場合、serviceName=$(systemctl status xyz)変数は実際には空であるため、この割り当ては機能しません(これがsystemctl status失敗すると4出力がに送信されるためですstderr)。したがって、両方を保存するには、次のものをstderr使用できます。

serviceName=$(systemctl status xyz 2>&1)

おすすめ記事