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