
システムやアプリケーションに障害が合った時に真っ先にログを確認すると思いますが、常にログを監視していなければ障害が発生したかどうかは分かりません。システムログを監視する方法として、ファイルの末尾を表示する tail コマンドを使ってファイルを監視する方法があります。しかし常に見ているわけにはいきません。tail コマンドを使って、管理者に何か通知するスクリプトを紹介したいと思います。
$ sudo tail -f /var/log/syslog
なお本スクリプトを使わなくてもシステムログに特定の文字列が出力されたら、何かアクションを起こすというアプリは探せば他にもいろいろあるので、実運用にはそちらを利用すると良いと思いますが、自前のアプリやデバックなどに利用して頂ければと思います。
スクリプトでは、sendmail コマンドを使うので postfix をインストールします。インストール時に「メール設定の一般形式」の選択を促されるので「インターネットサイト」を選択します。
$ sudo apt install postfix

インストール済みで外部にメールが送信されない場合は、以下のコマンドで postfix の再設定を行ってください。
$ sudo dpkg-reconfigure postfix
このスクリプトはアラート通知間隔を30分にしています。システム障害時、エラーメッセージが大量に出力されて大量のメールを送信してしまう可能性を防ぐ為です。
またnotify-send コマンドでディスクトップにアラートメッセージを表示しても良いですし、ターミナルから強制的ビープ音を鳴らす方法として以下のコマンドがあります。
$ echo -en "\007"
メール送信部分にビープ音を10回鳴らすコードなどを入れておけば、さらに簡易的なログ監視を行うことができます。
for i in `seq 1 10`;
do
echo -en "\007"
sleep 1
done
スクリプトの実行
$ sudo ./check_log.sh
システムログへの書き込みテストは以下のコマンドで行えます。
プロセス名 メッセージ
$ logger -t "test" "error"
check_log.sh
#!/bin/bash
# 検索するキーワード
KEY_WORDS=("critical" "error" "notice");
# 送信時間クリア
SEND_DATE=""
# 送信待ち時間
SLEEP_TIME=1800
# システムログを監視
# -F は、ログローテションでファイル名が変更されても、新規の /var/log/syslog を再監視
tail -F /var/log/syslog | while read line
do
# ループでキーワードを抽出
for key_word in ${KEY_WORDS[@]}
do
# 出力された文字列にエラーがあるかチェック
if echo $line | grep -qi "${key_word}" ; then
# 現在の時刻 - 送信待ち時間 を計算
NOW_DATE=`date +'%y%m%d%H%M%S'`
NOW_DATE=$(($NOW_DATE-$SLEEP_TIME))
# 初回か送信待ち時間を超えていたらメールを送信
if [ "${SEND_DATE}" = "" ] || [ "${SEND_DATE}" -le "${NOW_DATE}" ]; then
SEND_DATE=`date +'%y%m%d%H%M%S'`
# 送信元、件名、宛先、本文を記述してメールを送信
/usr/sbin/sendmail -t << EOF From: root
Subject: アラートメッセージ
To: taro@example.com
${line}
EOF
echo "send ${line}"
else
# 未送信の場合
echo "pass send ${line}"
fi
fi
done
send mail