子プロセスに処理を渡して、親プロセスで標準出力を切るとき、
my $pid;
if($pid = fork){
#親の処理
close (STDOUT);
wait;
}
elsif(defined $pid){
close (STDOUT);
#子の処理
}
・
・
・
みたいな感じで今までOKだったのだが、ロリポップ系サーバなどではこれがうまく行かない。ブラウザの出力自体は切れるのだが、子プロセスの処理を行ってくれない。
WEBサーバによって変わると聞いたことがあるので、ググってみたところ、標準出力を切る部分を、
close (STDOUT);
close (STDERR);
close (STDIN);
とやったら上手く行った。
apache2.0系(うちの環境)とapache1.3系(ロリポップ系?)でどうやら違うらしい。
ちなみに、上記3つの順番が違っても1つ足りなくてもダメだった。
close (STDIN);
close (STDOUT);
close (STDERR);
↑これだとなぜか子プロセスが終了するまでブラウザが開放されない
close (STDOUT);
close (STDERR);
close (STDIN);
↑この順番じゃないとダメみたい。
STDOUTだけだと、新しいapacheのときダメだよって聞いていたので、それとは逆の現象だが、解決したからまあいいか。
my $pid;
if($pid = fork){
#親の処理
close (STDOUT);
wait;
}
elsif(defined $pid){
close (STDOUT);
#子の処理
}
・
・
・
みたいな感じで今までOKだったのだが、ロリポップ系サーバなどではこれがうまく行かない。ブラウザの出力自体は切れるのだが、子プロセスの処理を行ってくれない。
WEBサーバによって変わると聞いたことがあるので、ググってみたところ、標準出力を切る部分を、
close (STDOUT);
close (STDERR);
close (STDIN);
とやったら上手く行った。
apache2.0系(うちの環境)とapache1.3系(ロリポップ系?)でどうやら違うらしい。
ちなみに、上記3つの順番が違っても1つ足りなくてもダメだった。
close (STDIN);
close (STDOUT);
close (STDERR);
↑これだとなぜか子プロセスが終了するまでブラウザが開放されない
close (STDOUT);
close (STDERR);
close (STDIN);
↑この順番じゃないとダメみたい。
STDOUTだけだと、新しいapacheのときダメだよって聞いていたので、それとは逆の現象だが、解決したからまあいいか。

コメントする