前回の記事では、よっぽど洗練されたシステムじゃない限り、頻繁にメールが飛んでくるので使い物にならない。
で、「ある程度ログをまとめて送信しようじゃないか。」という話になるのでやってみる。
まずはパイプ作成
# mkfifo -m 600 /var/log/hoge_alert
パイプに対してログを吐くようにrsyslogの設定変更。
# vi /etc/rsyslog.conf #----------------------------------------------------------------------------- # パイプで特定のログを通知 user.err |/var/log/hoge_alert # err以上を吐く #-----------------------------------------------------------------------------
60秒おきにtappe@hoge.comにメール送信するスクリプト、hoge_alert_mail.shを作成。
#!/bin/bash while [ 1 ]; do allmessages="" while read -t 60 message; do allmessages="${allmessages}${message}@RET@" done < /var/log/hoge_alert if [ "z$allmessages" != z ]; then echo $allmessages | sed 's/@RET@/n/g' | /usr/bin/Mail -s 'syslog hoge alert' tappe@hoge.com fi done
とりあえず実行権限を与えて実行してみる。
# chmod +x hoge_alert_mail.sh
# ./hoge_alert_mail.sh
ログ吐いてみる。
$ logger -p user.err hogehoge
60秒後にメールが届けば成功。
で、毎回コンソールから実行するのは面倒すぎるので疑似デーモン化してみる。
# vi /etc/inittab
alog:2345:respawn:/home/tappe/hoge_alert_mail.sh # 追加
init に SIGHUP シグナルを送信して、 /etc/inittab を再度解釈してもらう。
# kill -HUP 1
動いているか確認。
# ps -C hoge_alert_mail.sh
PID TTY TIME CMD
18702 ? 00:00:00 hoge_alert_mail.sh
ログを吐いてみる。
$ logger -p user.err hogehoge
60秒後にメールが届けば成功。
殺しても生き返るかチェック。
# kill -9 18702
# ps -C hoge_alert_mail.sh
PID TTY TIME CMD
2963 ? 00:00:00 hoge_alert_mail.sh
めでたし、めでたし。
追記:めでたしと思ったが、この方式はスクリプトの中でメモリにログをため込む方式なので、ため込む量が多いと送信できなくなったりと怪しげな挙動をする。ファイルに書き出して定期的にメールする方がよさげ。
http://www.usupi.org/sysad/133.html
http://www.usupi.org/sysad/094.html