apacheから起動したプロセスを完全に切り離したい
ブラウザから重い処理を走らせたい場合にCGIプロセスとは別にプロセスを作成して、
そのプロセスに重い処理を任せ、CGIプロセスは画面表示して終わりといったプログラムを組んだとして。
この場合にapacheを再起動した際に別に作ったプロセスも一緒に落ちてしまう問題がある。
if (my $pid = fork) {
#親プロセスは画面表示して終わり。
}
elsif (defined $pid) {
#子プロセス
$SIG{CHLD} = "IGNORE";
close(STDOUT);
#重い処理
exec 'COMMAND parameter';
}
else {
#エラー処理
}
perlで書くとこんな感じになる。
$SIG{CHLD} = "IGNORE"は、こうすることで、親プロセスが子プロセスの終了を待たなくて良くなり、
子プロセスがゾンビにならなくなるとどこかで見たので、そのまま書いてみた。
close(STDOUT);を入れることでapacheを待たせないで済むらしい。
でまぁ、これはこれで、うまく子プロセスが生成されて重い処理が走ります。
ただ、この時にやむを得ずapacheをstopさせたり、restartさせたりすると重い処理を走らせている子プロセスまで一緒に落ちてしまうのです。
恐らく、この子プロセスがapacheの子プロセスと認識されている為だと思います。
で、プロセスの親子関係をどうにかapacheから切り離したくて、バックグラウンド実行してみたりしたけどうまくいかず・・・。
まぁ、結論としては、分からずってことなんですけどね。
実行ユーザが同じだから、とかかなぁ・・・。
まじわかんねぇ。