我無法從運行在mod_perl2下的一些代碼中分離長時間運行的進程。如何正確使用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得到支持。 (編輯:Apparently它不再需要..)
任何關於如何正確啓動從mod_perl2長期運行的進程沒有這些問題將不勝感激!
嗨丹,你是如何解決這個問題的,我面臨同樣的問題。早些時候,我使用mod_perl1和`$ r-> cleanup_for_exec`工作正常,但在mod_perl2這不再需要,所以你可以幫我實現這個mod_perl2?提前致謝。 – 2013-06-14 10:29:55