ログファイルを監視し、さまざまな状況に応じてさまざまなコマンドを実行します。

ログファイルを監視し、さまざまな状況に応じてさまざまなコマンドを実行します。

監視するログファイルがあり、満たされている条件に応じて別のコマンドを実行する必要があります。

私はこれに近い解決策を見つけましたここ。残念ながら、それは私には機能しません、ただ端末に空白行を提供します。

xterm -e "$path_to_program | tee -a ${log_path}" & tail -f ${log_path} | awk '/Initialization Sequence Completed/ { system("echo "VPN is running."") } /[HOST_NOT_FOUND]/ { system("echo "error"") }

私の問題を解決するのに役立つ他の解決策はありますか?

答え1

上記のサンプルコードでは、文字を正しくエスケープしていません。次のようなものがさらに必要です。

tail -f ${log_path} | awk '/Initialization Sequence Completed/ { system("echo \"VPN is running.\"") } /\[HOST_NOT_FOUND\]/ { system("echo \"error\"")}'

logrotateを試してみることもできます。このルールを使用すると、postrotate無限に大きくなったり、ストレージスペースを満たさないログをログプロセッサに処理させることができます。

答え2

解決策今後うまくいきますが、私が見つけた問題にのみ当てはまります。何らかの理由で、awkは2分ごとにログファイルのみを読み取り、その時点でログにHOST_NOT_FOUNDが数回表示されるため、「エラー」として端末にスパムを送信します。より良い解決策が見つかりましたこれワイヤー。尾は個別に閉じる必要があることを覚えておいてください。

tail -f ${log_path} | while read LOGLINE
do 
     [[ "${LOGLINE}" == *"Initialization Sequence Completed"*]] && echo "VPN is running"
     [[ "${LOGLINE}" == *HOST_NOT_FOUND"* ]] && echo "VPN failed."
done

関連情報