昨日のエントリの続きで。
下記みたいな感じで、実行コマンド(hoge.script)にログ内容をパラメータとして渡して実行出来るように
なったと思いきや、新たな問題発覚です。。
watchfor /ERROR/ exec "hoge.script $_"
合致したログにスペースがあった場合に、パラメータが配列として渡されます。
例えば、こんなログの場合
[2005/12/07 12:10:10] ERROR hogehoge
パラメータとして渡されるのは、スペースで区切られて、下記のような4つになってしまいます。
- [2005/12/07
- 12:10:10]
- ERROR
- hogehoge
実際swatch(perl)の内部では、下記みたいな感じになっているようで、、
exec("hoge.script $_")
$_が展開されて、実行されるのコマンドイメージは下記のようになります。
hoge.script [2005/12/07 12:10:10] ERROR hogehoge
単純に実行されるコマンド側で、全パラメータを結合したらとかって考えましたが、当然スペースの数とかが判断出来ないので完全なる復元は無理です。
しかもログにパイプ(|)やリダイレクト(>)なんかが入ってたりしたら、コマンド自体実行出来なくなる可能性があるので、どうしたものやらと…
で、よくよく調べたら、アクションでpipeというものがありました。
pipe command[,keep_open] パイプでコマンドに結果を渡す。keep_openを指定すると異なるパイプが実行されるか、swatchが終了するまでパイプが実行されたままになる
で、実行されるコマンド側で、パラメータとして受けていたログ内容を、標準出力で受け取るようにして、swatchの設定は下記のように変更したところ、思った通りの動き(ログ内容を1行分受け取れる)ようになりました。
watchfor /ERROR/ pipe="hoge.script"
最初からpipeでやってれば、、
逆にexecでパラメータ渡して使う場合って無いような気がします。