なんやかんやでサーバーにswatch監視を入れる機会があったのでメモ。
swatchのインストール
ソースをダウンロードしてインスコする。
ソース
http://sourceforge.net/projects/swatch/files/swatch/3.2.3/swatch-3.2.3.tar.gz/download
tarを解凍してディレクトリ移動し
$ perl Makefile.PL
足りないモジュールがあればこの時点で下記のように表示されるのでCPANから入れる。
Warning: prerequisite Date::Format 0 not found.
Warning: prerequisite Date::Manip 0 not found.
Date::Manipが最新バージョンのだとperl v5.10.0じゃないとダメと言われるので
Perl v5.10.0 required--this is only v5.8.5, stopped at Makefile.PL line 3.
古いバージョンのをインスコすることにする。
cpanのwebからDate::Manipを検索しダウンロードのURLを確認してファイル名称を削ってアクセスするとディレクトリの中身が見れるのでインストールしたいバージョンを確認する。
URLのid以降を用いて下記のようにインスコ。
cpan > install S/SB/SBECK/Date-Manip-5.54.tar.gz
必要なモジュールを入れ終わったらswatchをmake。
ちゃんとインストールされたかどうかは下記コマンドで確認。
# type swatch
swatch is /usr/bin/swatch
設定ファイルの記述
今回は/var/log/messagesにhogehogeというログが表示されればアラートメールを送信する設定を入れる。
メール飛ばすだけでなくプログラムを経由させることとかできたりしますので詳細を知りたい方は下記のページに詳しく書いてありますので(大分参考にさせていただきました)ご覧下さい。
@IT:サーバのログ監視ツールを使いこなそう
/root/.swatchrcを作成
watchfor /hogehoge/
echo
mail=ここにメールアドレス,subject=メールのsubject
試しに動かしてみる。
# /usr/bin/swatch -c /root/.swatchrc -t /var/log/messages
別窓開いてmessagesにswatchの設定で入れた文字列を表示させてみる。
# logger "[test]ababababa hogehoge ababa[test]"
※あとでログ見て焦らないために[test]という文言は入れといたほうがいいかもです。
これでswatchを実行しているほうの窓に上記ログが表示されれば正常に検知できたということ。
起動スクリプトを用意
サーバー再起動の度にいちいち手動でswatch立ち上げるとか健気なことをしなくていいように起動スクリプトを用意する。
※とあるサイトの記述を参考にさせていただきましたがURL失念しましたorz。
/etc/init.d/swatch#!/bin/sh
#
# chkconfig: 2345 99 25
# description: swatch
. /etc/rc.d/init.d/functions
RETVAL=0
# See how we were called.case "$1" in
start)
echo -n "Starting Swatch: "
/usr/bin/swatch -c /root/.swatchrc -t /var/log/messages >/dev/null 2>&1 &
RETVAL=$?
echo
;;
stop)
echo -n "Stopping Swatch: "
killproc tail
RETVAL=$?
echo
;;
restart)
$0 stop
$0 start
RETVAL=$?
;;
*)
echo "Usage: swatch {start|stop|restart}"
exit 1
esacexit $RETVAL
※2回スクリプト叩けば華麗に多重起動してしまうので厳密にやりたい場合はpidとかで管理することをおすすめします。
chkconfigを設定
# chkconfig swatch on
sendmailのchkconfigもついでにon
# chkconfig sendmail on
問題点
メールがキューに入ったままになって飛ばない問題が発生。
sendmailを再起動すれば飛んでったけどその後もっかいswatchで検知してもまたキューに入ったままに。
原因はswatchのソースにありました。
$SOURCE/lib/Swatch/Actions.pmの中に下記の記述があるのですが
$args{'MAILER'} .= ' -oi -t -odq';
ここの-odqがキューに入れるというオプションのようです。
なのでこのソースを書き換えて再度swatchをmakeし直す。
これでちゃんとメールも飛んでめでたしめでたし。
意外と大事なおまけ
messages等のローテートされるファイルを監視対象にしている場合、ローテートされた後正常に監視がされないという問題があるようです。
ですので、対象ログがローテートされるタイミングでswatchを再起動してやる必要があります。
/etc/logrotate.d/syslog を編集
/var/log/message {
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
- /etc/init.d/swatch restart >/dev/null 2>&1
endscript
}