因此,我在 mod_perl 脚本中使用了 Proc::Daemon:
$bindir、$ddir 是可执行文件/日志文件位置,$jid 是每个进程的唯一标识符(以避免多个进程打开同一个文件)。$cmd 加载了任意 perl 脚本和参数。
my $daemon = Proc::Daemon->new (
work_dir => $bindir,
child_STDOUT => $ddir.'/'.$jid.'_stdout.log',
child_STDERR => $ddir.'/'.$jid.'_stderr.log',
pid_file => $ddir.'/'.$jid.'_pid.txt',
exec_command => $cmd,
);
my $pid = $daemon->Init();
将 Apache 与 cgi-script(无 mod_perl)一起使用时,上述工作正常。在“$cmd”进程中,打印STDERR日志并将其打印到上面定义的日志文件中。
当我在 Ubuntu Linux 14.04 LTS 上使用 Apache2 使用 mod_perl2 运行上述程序时,使用 PID 写入 pid 文件并创建上述日志文件,但没有将任何内容写入日志文件。我可以在 $cmd 中打开新的文件描述符并写入它们,但是在 mod_perl 下,它不会将输出发送到 child_STDOUT 和 child_STDERR 文件。
我想我错过了一些非常明显的东西。有没有其他人以前见过这个,或者有任何建议让它在 mod_perl 中工作。
附加信息 在 Apache 中使用 mpm_prefork 模块
相关的 Apache 配置
<Files "*.pl">
# SetHandler cgi-script # It works if I use cgi-script
SetHandler perl-script
PerlOptions -SetupEnv # Tried with and without this
# PerlHandler ModPerl::RegistryPrefork # Using this made no difference
PerlHandler ModPerl::Registry
</Files>