読みながらドアを壊す

読みながらドアを壊す

複数のサーバーのログファイルを監視し、特定のキーワードが表示されたときに電子メール/ txt警告を送信するスクリプトを作成しています。これまでのところ、以下を使用すると、すべてがうまく機能します。

tail -n 0 -f "$MS01_LOG_FILE" "$MS02_LOG_FILE" | while IFS= read -r line; do
#do some fun things here
done

問題は、時々サーバーがハングして、かなり長い間ログファイルに出力できないことがあります。もちろん、私のスクリプトは、入力を待っている読み出し行をそのまま維持します。バックグラウンドで実行されるタイマーが必要で、行の読み取りが中断される可能性があります。

ベストアンサー1

長い話を短く

次の回避策はトリックを実行する必要があります。

#!/bin/bash

MS01_LOG_FILE=/var/log/dmesg
MS02_LOG_FILE=/var/log/syslog

TIMEOUT=10  # modify to your liking

tail -n 0 -f "$MS01_LOG_FILE" "$MS02_LOG_FILE" | while :
do
    IFS= read -t $TIMEOUT -r line
    # do your funny things here
done

詳細

最初に引用された内容はhelp read(参照組み込みコマンド「read」の bash リファレンスマニュアル)

-t timeout
入力行全体(または指定された文字数)がタイムアウト秒以内に読み取られない場合は、読み取りタイムアウトでエラーが返されます。 timeout は、小数点の後に小数部がある 10 進数です。このオプションは、読み取りが端末、パイプ、またはその他の特殊ファイルから入力を読み取る場合にのみ有効です。通常のファイルから読み込むときは効果がありません。読み出しがタイムアウトした場合、読み込みは指定された変数名に読み込まれた部分入力を保存します。タイムアウトが 0 の場合、読み取りはデータの読み込みを試みずにすぐに返されます。指定されたファイル記述子で入力が使用可能な場合、終了ステータスは 0 で、そうでない場合は 0 ではありません。タイムアウトを超えると、終了ステータスは128より大きくなります。

異なる実装間では、読み取りタイムアウトを検出するために使用される終了ステータスが128より大きいという保証はありません(たとえば、私のOS X bashでは1です)。

-t $TIMEOUT最初のスクリプトに追加するだけで、ソリューションの一部のみが提供されます。排気管が何でも放出されるまで、壊れたパイプが検出されないためです。

read無限のwhileループに移動すると問題が解決します。

代わりに、何をしたいかによって、# do your funny things hereサブプロセス刑務所を脱出する問題に直面する可能性があります。

この場合、確認https://stackoverflow.com/questions/20558295/quit-from-pipe-in​​​-bash

おすすめ記事