私の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)