Apache2.4でfork後ゾンビプロセス

 Apache2.4でCGI-Perlを動かしたとき、あるPerlスクリプトがゾンビプロセスになった。そのスクリプトは要求を受けると、ごく短いHTMLページを返して、forkする。親プロセスはそのまま終了し、クライアントに制御を返す。子プロセスはそのまま処理を続け、5分以上かかるタスクを行う。

 しかし、実行してみると、先に終了した親プロセスがゾンビプロセスになり、制御をクライアントに返さない。30秒程すればそのゾンビプロセスは消えるが、クライアントはその間待っている状態であり、ブラウザがタイムアウトしてしまう。

 子プロセスがゾンビになるのは分かるが、親プロセスがゾンビになるのが謎だ。ためしに、子プロセスを親プロセス終了後、すぐに終了するように変更すると、すぐに制御がクライアントに戻った。

 スクリプトをあれこれいじったが、変化がない。そこで、httpd.confを見てみると、mod_cgiとmod_cgidが両方ロードされていた。この2つのモジュールは、CGIを動かすのに必要で、本質的には同じものらしい。そこで、mod_cgiの方をロードしないようにして、apacheを再起動し、forkするPerlスクリプトを実行したところ、期待したとおりの挙動を示した。親プロセスはすぐに制御を返して終了し、子プロセスはタスク処理を無事続行した。