startコマンドがファイルデスクリプタを引き継いでしまう
3つのスクリプトがあるとする。
- a.bat は b.bat を実行し、そのエラー出力をログに保存する
- b.bat はいろいろな処理をする過程で c.pl というデーモンを起動する
- c.pl はデーモンなので終了しない
# a.bat call b.bat 2>>error.log # b.bat start wperl c.pl # c.pl use AnyEvent; my $cv = AE::cv; ... $cv->recv; # 基本的に終了しない
この時、startで起動した c.pl の出力はリダイレクトされていないのにも関わらず、ログファイルが c.pl によって使用中になっていまう。a.bat としてはログを処理して処分したいが、Windowsにおいて開いているファイルは処分できないので困る。
startでも&2をリダイレクトしてみたが、古いデスクリプタを閉じてはくれないようだ。
a.bat であらかじめ c.pl を起動しておく以外に解決する方法はないのだろうか? まあ、トラブルメーカーなbatを止めるのがいいのだろう。