前回の記事で、apacheのログ出力をスクリプトに渡すには、httpd.confのCustomLogの部分をパイプを使って書けばいいだけでした。
しかし、syslogの場合は、syslog.confに同様の記述をすると、スクリプトのソース内にログを出力してしまいます。
そのため、syslogの出力をスクリプトに渡すには少し工夫がいるわけです。
今回はその手順を簡単に説明します。
以下のコマンドでfifoスペシャルファイルを作成します。
$ mkfifo test.fifo
このファイルは、簡単に言うと、コマンドのパイプのように、一時的にパイプする出力を保存しておく特別なファイルです。
そして、syslogの出力をこのfifoファイルにパイプして一時的に保存しておきます。
syslog.confの設定例は以下。
*.info;mail.none;authpriv.none;cron.none |/root/test/test.fifo
そして、このfifoファイルをスクリプト内でファイルオープンすることで、syslogの出力を受け取ることができるわけです。
例えば、前回の記事のircに書き込む出力を用いて、直接パイプでスクリプトに渡すのではなく、スクリプト内でファイルハンドルをオープンするように書き換えます。
後は、スクリプトをバックグラウンドで実行することで、ircにsyslogのログを出力できるわけです。
以下、スクリプトの変更例。
sub irc_write { my $input; my $fifo_name = "/root/src/test.fifo"; while(<SOCKET>) { print $_; if($_ =~ /End of NAMES list/) { open(HANDLE, $fifo_name); while($input = <HANDLE>) { if($input =~ /^$/) { print SOCKET "PRIVMSG $channel :\t\r\n"; sleep 5; } else { $input = &url_decode($input); Jcode::convert(\$input,"jis"); print SOCKET "PRIVMSG $channel :$input\r\n"; sleep 5; } } close(HANDLE); print SOCKET "QUIT\r\n"; } } }
書き込みのサブルーチンはこんな感じです。