tail -f を使用してログを監視する場合の例外処理

tail -f を使用してログを監視する場合の例外処理

監視を実行するためにスクリプトを呼び出す基本スクリプトがあります。

ログがないかアクセスできなくなった例外をキャッチしようとしています。

tail -f-Fログ名は現在の日付に基づいて指定されるため、代わりに使用してください。

traptail -fうまくいくかもしれませんが、監視されているログがもう存在しない場合は、どの信号が返されるのかわかりません。

それ以外の場合は、基本スクリプトでループチェックを実行する必要がありますか[ -r $Log]

答え1

プログラムはtailファイルが削除されたことを知らない。これには別のものが必要です。これinotifyLinuxの機能により、アプリケーションはファイルイベントに関する通知を受け取ることができます。他のほとんどの大学にも同様の機能があります。次のコマンドは、file.log削除時に通知を印刷します。

inotifywait -e delete file.log

答え2

ちょうど主な問題がどこにあるかを確認しようとしました。

tail -f既存のファイルに対して操作を実行してからファイルを削除すると、tailこれはまったくわかりません。理由は簡単です。tail -fファイルの内容を参照する読み取り専用ファイルハンドルを開きます。これでファイルが消えると、メタディレクトリエントリのみが消えます。最後のFHが閉じたときに割り当てが解除されます。tailこの場合はそうです。

だからあなたはする必要があります

  • tail -f独自のバックグラウンドプロセスに入れてPIDを覚えてください。
  • ファイルの存在を監視するために別のプロセスを開始します(毎秒whileループなど)。
  • このモニターがファイルが消えたことがわかった場合は、選択された信号を使用してそのテールプロセスのPIDにテールプロセスで利用可能な信号を送信する必要がありますtrap

答え3

$ tail -f blah
tail: cannot open `blah' for reading: No such file or directory
$ echo $?
1

最初にファイルが存在しない場合はテストできますが、ファイルにアクセスできなくなると役に立ちません。whileこの場合、ループはより良いかもしれません。

while [ 1 ]
do
        tail $1
        if [ "$?" != "0" ]
        then
                echo "No access to file"
                exit 1
        fi
done

私の考えはスタックオーバーフロー回答。他のオプションもありますが、これは簡単です。

関連情報