前回の記事で、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";
}
}
}
書き込みのサブルーチンはこんな感じです。