mod_perl2で実行されているコードから実行時間の長いプロセスをフォークするのに問題があります。
ほとんどすべてが機能しますが、フォークされたプロセスはApacheのログファイルへのオープンハンドルを保持しているようです-これは、プロセスの実行中にApacheが再起動しないことを意味します(「ログファイルを開けませんでした」というメッセージが表示されます)。
これが私が使用しているコードです:
use POSIX; # required for setsid
# Do not wait for child processes to complete
$SIG{CHLD} = 'IGNORE';
# fork (and make sure we did!)
defined (my $kid = fork) or die "Cannot fork: $!\n";
if ($kid) {
return (1, $kid);
}else {
# chdir to /, stops the process from preventing an unmount
chdir '/' or die "Can't chdir to /: $!";
# dump our STDIN and STDOUT handles
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
# redirect for logging
open STDERR, '>', $log_filename or die "Can't write to log: $!";
# Prevent locking to apache process
setsid or die "Can't start a new session: $!";
# execute the command
exec( $cmd, @args );
die "Failed to exec";
}
mod_perl1の時代に、$r->cleanup_for_exec
この問題を解決するために使用したことを思い出しますが、mod_perl2ではサポートされていないようです。(編集:どうやらそれはもう必要ありません..)
これらの問題なしにmod_perl2から長時間実行プロセスを正しく開始する方法に関するアドバイスをいただければ幸いです。