我在从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正确启动长时间运行过程的任何建议将不胜感激!