うまいぼうぶろぐ

linuxとhttpdとperlのメモ

CGI(perl)内でforkしてbackgroundで走らせたい

userには素早くresponseを返して、重たい処理等はbackgroundで続けたい、みたいな。恐らく今時の(というか真面目な)方法なら、 TheSchwartz あたりの job server を用意して、CGIではenqueue しとけばいいのだろう。で、後はjob workerがせっせと頑張る。

だけど、今想定しているオレオレ管理用CGIでは、誰かがたま〜にaccess する程度なのでjob serverを用意するのも大げさかなと。だもんでlegacyな(?) 方法でfork してbackground に投げっぱなしなやり方を調べた。(多重起動の問題については今は考えない)

やってみたら 出来た。

  1. 適当なとこでfork
  2. 親プロセスはHTMLを出力してexit
  3. 子プロセスで重たい処理をする(or 重たい何かのコマンドをsystemで実行とか
  4. 子プロセスの標準出力、入力、エラーのファイルハンドルを閉じる

最後が重要?webで見てるとSTDOUTのclose だけで良いと書いてたけど、local の環境 (apache 2.2.17 prefork + perl 5.10.1) ではSTDOUT, STDIN をclose しないとダメだった。念のためSTDERRも閉じておく。

ref.