- PR -

Syslog-ngで特定ログ検知時のProgram実行ができない

投稿者投稿内容
しげしげ
会議室デビュー日: 2008/09/22
投稿数: 15
投稿日時: 2008-10-27 16:04
以下の用にSyslog-ngで特定ログ検知時に
シェルを実行するようにしていますが、実行できません。

(syslog-ng.conf)
destination d_restart {
program("/usr/local/tools/syslog-restart.sh");
};
filter f_restart {
filter(f_messages) and match("xxx");
};
log {
source(src);
filter(f_restart);
destination(d_restart);
};

(syslog-restart.sh)
#!bin/sh

/etc/init.d/syslog restart

メール送信等のようにスクリプトは実施可能でした。
デーモン再起動時の書き方がおかしいのでしょうか?
あるかな
大ベテラン
会議室デビュー日: 2003/11/04
投稿数: 245
投稿日時: 2008-10-27 18:03
こんばんは。

単純に転載ミスと思いますが、
(syslog-restart.sh)
#!bin/sh ×

#!/bin/sh ○

ではないかと。

> メール送信等のようにスクリプトは実施可能でした。
> デーモン再起動時の書き方がおかしいのでしょうか?

状況が読み取れないのですが、アクションを syslog-restart.sh ではなく、
メール通知用のスクリプトに置き換えたら動作した、ということでしょうか?
であれば、Console 上から syslog-restart.sh をコマンド投入して動作するか、
を確認してはどうでしょうか?

#追記
環境がわかりませんが、起動スクリプトは /etc/init.d/syslog-ng では?

[ メッセージ編集済み 編集者: あるかな 編集日時 2008-10-27 18:05 ]
しげしげ
会議室デビュー日: 2008/09/22
投稿数: 15
投稿日時: 2008-10-27 18:51
#!/bin/sh ○
記載ミスでした。すみません。

Console 上から syslog-restart.sh をコマンド投入して動作はします。
OSはSuSE10.2ですが、デフォルトは/etc/init.d/syslogになっています。

マッチさせる文字列(xxx)が1秒に数度も出力され続けるようなログなのですが、
もしかすると、スクリプト実施中に、スクリプトを実施しようとしてしまい、
それが続くと実行されないようなことはあるでしょうか?
水都
大ベテラン
会議室デビュー日: 2004/07/22
投稿数: 111
投稿日時: 2008-10-28 09:21
syslog-ngがキックしてくれるスクリプトを手動で実行は可能である
しかしマッチ文字列がログにあっても実行してくれない、という事でよろしいですか?

気になるのは「スクリプトが実行されていない」のか、「スクリプトは実行されているが期待した動作をしない」のかです
ファイルに実行権がないが、手動では
 sh syslog-restart.sh
としていたので動いていたとか、環境変数の問題でスクリプト内でエラーが出ていないかとか

あと単純に条件にマッチしていないとか
filter f_messagesが定義されてない、なんてオチはありませんよね?
takat
会議室デビュー日: 2008/10/28
投稿数: 10
投稿日時: 2008-10-28 19:29
以下に記載してある通り、syslog-ng では destination-driver に program を使用した場合、stdin にログメッセージを送信するようになっているようです。

http://www.balabit.com/dl/html/syslog-ng-v3.0-guide-admin-en.html/ch03s04.html#configuring_destinations_program

syslog-ng 起動時に対象プログラムも起動されるようなので、期待の動作にはならないかと思います。
プログラム上で STDIN を監視して、入力があった場合に syslog-ng の再起動を行うような動作に変更してはどうでしょう。
しげしげ
会議室デビュー日: 2008/09/22
投稿数: 15
投稿日時: 2008-10-28 23:59
ありがとうございます。

実はここまできてどんでん返しなのですが、
Syslogを再起動しているのではなく、他のサービスを再起動しています。
例としてSyslogを上げていました・・・。

Syslogの再起動をしていない場合でも失敗するようなことはあるのでしょうか?
度々本当にすみません。
あるかな
大ベテラン
会議室デビュー日: 2003/11/04
投稿数: 245
投稿日時: 2008-10-29 00:22
ここで言う takat 様の言いたいことは、
syslog-ng の起動時に program で指定されたスクリプトがこのタイミングでキック
(オープン?)された状態になり、条件一致した場合にそのオープン状態のスクリプトへ
stdin を通してログを送るコト、かと思います。
#処理の仕様を勘違いしている件を指摘されているのかと。

従って、スクリプト内で「ログを受け取った場合に特定プログラムをキック」する仕様に
してあげないと(キックするプログラムがなんであれ)期待した動作はしないでしょう、
ということではないでしょうか。

あと後出しは質問を簡潔にする上で良い場合もありますが、変に置き換えるのはどうかと。。。

#Swatch 使いとしては、ちょっと・・・な仕様っぽいですが、それならそれで特別面倒ではないのかもしれません。

#言葉足らずを補足

[ メッセージ編集済み 編集者: あるかな 編集日時 2008-10-29 00:29 ]
水都
大ベテラン
会議室デビュー日: 2004/07/22
投稿数: 111
投稿日時: 2008-10-29 09:11
>syslog-ng 起動時に対象プログラムも起動されるようなので
なるほど、私もprogramに渡した時点でキックされるものと誤解しておりました
というかちゃんとドキュメント読んでなかったんですが(ぉ
実際に運用している機体のプロセスを見ると、確かに

root 22317 1 0 Mar10 ? 00:00:11 syslog-ng
root 25082 22317 0 Oct26 ? 00:00:00 /bin/sh /usr/local/script/raiderr.sh

となっておりました
定期的にSW-RAIDの状態をチェックして異常があったらログに書き込むスクリプトが別に動いており、
このスクリプトはそれを拾ってメール通報するものですのでstdinを拾っていましたが
それがトリガになっていようとは・・・

スキルアップ/キャリアアップ(JOB@IT)