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を追加しましたが、スクリプトが実行されるたびに必要な正規表現を含む行に関係なく、サービスファイルを再起動します。
これらのスクリプトは次のとおりです。
答え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 )