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スクリプトを実行したところ、期待したとおりの挙動を示した。親プロセスはすぐに制御を返して終了し、子プロセスはタスク処理を無事続行した。

コメントを残す

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>