ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

CGIのレスポンスを返してから、バックグラウンドで処理を続けるには?

子プロセスで実行:

#!/usr/bin/perl

eval{
  $ppid = $$; #<-親プロセスID

  $| = 1; # バッファリングの制御。

  FORK: {
    if( $pid = fork ) {

      print "親プロセスID=$ppid  子プロセスID=$pid";

      # 親プロセス
      close(STDOUT); # apache が終了ステータスを返し、ブラウザが開放される
      wait;  #←子プロセスの回収
    } elsif (defined $pid) {
      # 子プロセス
      close(STDOUT); # apache が終了ステータスを返し、ブラウザが開放される
      #
      # バックグランドで実行する処理
      #

      exit;
    } elsif ( $! =~ /No more process/) {
      # プロセスが多すぎる場合
      sleep 5;
      redo FORK; # 5秒後に再実行
    } else {
      # エラーケース
      die "Can't fork: $\n";
    }
  } # End Of Label:FORK
  1;
};
if($@){
  # close(STDOUT) のあとは標準出力できない。
  print "Error! : $@";
}

とりあえずいじょ。

最近目がかゆくてダメだ…疲れ目orストレスor暑さ。
目と歯は大切に!!