ログ出力キーワードに基づいてサービスを再起動します。

ログ出力キーワードに基づいてサービスを再起動します。

systemctl statusまたはログファイルに特定のテキスト出力が表示されたら、サービスを再起動しようとします。

この例の行全体は次のとおりです。

Aug 27 01:05:16 SSD plexdrive410[1321]: [USR/LOCAL/BIN/PLEXDRIVE410] [2018-08-27 01:05] WARNING: Could not update/save object 4PASA4U3Gj8mTvllAAIgEqHdMFHER3q (screens.jpg)

キーワードには常に以下が含まれます。

WARNING: Could not update/save object

答えを見つけようとしましたが、見つかりませんでした。アドバイスをいただきありがとうございます!




使用するアップデートスクリプトは次のとおりです。

文章を書いて説明してくれてありがとう。最初はSERVICEが繰り返し再起動されます。

次に、スリープ30を追加しましたが、スクリプトが実行されるたびに必要な正規表現を含む行に関係なく、サービスファイルを再起動します。

これらのスクリプトは次のとおりです。

https://pastebin.com/Vd4bF18c

答え1

あなたは次のことをします:

#!/bin/bash

regex="plexdrive.*Could not update\/save object"

journalctl -f -n 0 |
while read line
do
    if [[ "$line" =~ $regex ]]; then
        systemctl restart PLEX_SERVICE
    fi
done

journalctlシステムログの出力を取得します。-fコマンドがここにあり、新しいジャーナルエントリを提供するためにフォローモードを使用してください。-n 0以前の日記エントリを提供しないように指示します。

出力はにパイプされますwhile read line。これは出力ストリームから無限に読み取られ、journalctl各行をシェル変数に入れますline

=~バッシュのものです。正規表現オペレーター。ここでは、行にandのplexdrive後にどこかに含まれていることを確認しますCould not update/save object。表示された正規表現がregex一致すると、その行が実行されます。systemctl restart PLEX_SERVICE

答え2

これは、JVM OOMエラーをキャッチするために使用する上記のスクリプトのわずかに拡張されたバージョンです。 Shellcheckを使用して確認してください。

#!/bin/bash

regex="java.lang.OutOfMemoryError: Java heap space"
sysd_svc=$( systemctl | grep PLEX | awk '{print $1}' )

echo "Info, service '$sysd_svc' will be restarted on match with '$regex'"

while read -r line
do
        # note we DONT quote $regex because we're using ~=
        if [[ "$line" =~ $regex ]]; then
                echo "Info, restarting as line matched : $line"
                #systemctl restart "$sysd_svc"
        else
                echo "Info, line didn't match: $line"
        fi

done < <( journalctl -f -n 0 )

関連情報