我无法从在 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 正确启动长时间运行的进程而没有这些问题的建议将不胜感激!