今までログの監視は自作スクリプトで行っていたのだけど、swatchという便利なツールがある事を知り、早速導入してみた。
使用したswatchのVersionは3.1.1なのだけれど、家の環境ではマニュアル通りには動作しなかったので、 注意点をエントリします。
まず導入ですが、こちらはportinstall swatchで入ります。 /usr/local/etc/rc.d/swatch.shのコメントを見て、設定を行ったのですが、 以下の設定ファイルでは正しくマッチした行をコマンドに引き渡すことができませんでした。
watchfor /TEL\[01\/1\] InComing Call from/ exec "/root/swatch/telsend $0" |
このtelsendというコマンドの中身は割愛しますが、 この状態でargv[0]を見るとswatchが吐き出す一時実行スクリプトの名前そのものが渡ってしまいます。
仕方ないのでスクリプトを解析して、perlで書かれていたので、「$0」や「$*」 を指定しろとマニュアルにも書かれているのですが「$_」を指定したらうまく引き継がれました。 これは皆さんもswatchが出力する実行ファイルの中身を見れば理由は分かると思います。 $0や$*に対する処理が全くされていません。
あと、rcファイルですが、/etc/rc.confに以下の形式で二つのswatchを実行するように定義しました。
swatch_rules="1 2" swatch_1_flags="-c /root/swatch/swatch.tel.conf -t /var/log/rta52i-log --daemon --pid-file=/var/run/swatch_tel.pid" swatch_1_pidfile="/var/run/swatch_tel.pid" swatch_2_flags="-c /root/swatch/swatch.link.conf -t /var/log/linksys.log --daemo n --pid-file=/var/run/swatch_link.pid" swatch_2_pidfile="/var/run/swatch_link.pid" |
pidfileは個々に分けないと、/usr/local/etc/rc.d/swatch stop実行時に正常に停止出来ないみたいです。
しかし、/etc/local/etc/rc.d/swatch.shの中で、 停止時のKILLレベルが弱くて正常にこのままでは終了しません。「sig_stop=SIGKILL」 にKILLレベルを変更して対応しました。
ただし、この場合/rootに「.swatch_script.*」 というファイルがどんどん残ってしまうので適当なタイミングで手動で消す必要があります。うーん、不便。いまに何とかします。
最後に、家の環境だけかもしれませんが、結構有名だったswatchにしては単純なバグ?があるなあと思いました。 幸いなことに簡単な問題だったので対処は楽でしたが、同じ思いをしている方向けにエントリします。
後日談ですが、オプションに「--awk-field-syntax」を付けると、$0や$1が使えるようになるみたいです。
(参考サイト:@~のひたすらメモ、ありがとうございました)
私も色々、検索してようやくここにたどり着きました。
これで解決かと・・・・
http://www.linuxforums.org/forum/post-185198.html
Then running swatch with
swatch -t /var/log/auth.log -c /etc/swatchrc --awk-field-syntax --daemon
※コメント内にURLを書くとSPAM扱いとなります。2ch風に表記はOKです


