Bashスクリプトでログエントリのタイムスタンプを区別する

Bashスクリプトでログエントリのタイムスタンプを区別する

私のBashスクリプトはcronジョブとして実行されます。ログファイルで文字列を見つけ、見つかった場合は、そのログエントリをメールで渡す必要があります。

私のスクリプトは機能しますが、報告したログエントリには同じ文字列が含まれていますが、タイムスタンプは以前です。興味のあるログエントリの最新のタイムスタンプのみを送信するように変更したいと思います。

#!/bin/bash
grep "Too many files" /share/logs/access.log > /dev/null && grep "Too many files" /share/logs/access.log | mailx -s "Batch Error " to [email protected]

そのクローンジョブは10分ごとに実行されます。

*/10 * * * *  /myscripts/joberror.sh

私が探しているログエントリはaccess.log次のとおりです。

uzeadnos12 2020-10-14 13:29:00,443 ERROR  - Error occured while converting document using Libreoffice - /shard.tiff java.io.IOException: Cannot run program "": error=24, Too many open files

誰でもこのスクリプトを改善するのに役立ちますか?

答え1

~/spool/last_jobrecクローンジョブで記録された最後のタイムスタンプを記録できるコンテナ(ファイルなど)を作成します。これを最後に追加されたログエントリのタイムスタンプと比較します。両方が異なる場合に通知がエクスポートされ、2つが同じ場合は何もしません。

$ mkdir -p /path/to/spool    # choose a place for spool directory.
$ 
$ cat /myscripts/joberror.sh
#!/bin/bash
touch /path/to/spool/last_jobrec   # ensure appropriate permissions
latest_logentry=$(grep --no-messages --no-filename --max-count=1 -e "Too many open files" <(tac /share/logs/access.log))
latest_logstamp=$(cut -d' ' -f1,2 <(echo $latest_logentry))
if [ "$latest_logstamp" != "$(cat /path/to/spool/last_jobrec)" ]; then
    echo "$latest_logentry" | mailx -s "Batch Error " to [email protected]
    echo "$latest_logstamp" >| /path/to/spool/last_jobrec
fi

検証されていません。特に私はこのユーティリティを使用しませんmailx

コメント:
1)新しいログエントリがログファイルの末尾に追加されたとします。
2)上記の変数を埋めるために、last_entrystamp私はgrep。そうでない場合は、grepスクリプトの行を次のように置き換えます。latest_logentry=$(tail -1 /share/logs/access.log)

関連情報