CGIから外部プログラムをバックグラウンドで実行する

非常に時間のかかる処理をCGIから行う場合、ブラウザが応答待ちのまま固まったり、タイムアウトによって処理が中断してしまうといった問題がある。

こういった場合、forkを使ってPerlプロセス自身を複製するという手法もあるが、問題の処理は外部プログラムにしてバックグラウンドでの実行はシェルの機能に任せてしまうのがお手軽。

`/home/someone/bgprog > /dev/null &`;

末尾の&が「バックグラウンドで実行」を示すが、一緒に標準出力のリダイレクトを指定しておかないとPerlプロセスは延々と待ち続けてしまうので注意。シェル使いには常識なんでしょうけど、これでハマりました。

ちなみに、PHPでもまったく同じですね。