我在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();
使用带cgi脚本的Apache(无mod_perl)时,上述工作正常。在" $ cmd"处理,打印和打印STDERR日志到上面定义的日志文件。
当我使用mod_perl2运行上面的操作时,在Ubuntu Linux 14.04 LTS上,使用Apache2使用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>
答案 0 :(得分:0)
好的,所以有太多的解决方案无法正常工作这就是我最后做的事情。我创建了一个名为launchjob.pl的脚本:
#!/usr/bin/perl -w
use strict;
use warnings;
use POSIX 'setsid';
use Proc::Daemon;
my $bindir = $ARGV[0];
my $ddir = $ARGV[1];
my $jid = $ARGV[2];
my $cmd = $ARGV[3];
setsid or die "Cannot start a new session: $!";
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();
exit 1;
我在主线中替换了代码,我用以下代码调用了Proc :: Daemon:
以下不起作用。 Proc :: Daemon给了我一个sh:没有这样的文件或目录错误。
系统(&#39; launchjob.pl&#39;,$ bindir,$ ddir,$ jid,$ cmd);
相反,我使用了以下似乎按预期运行的内容。
使用IPC :: Run3; run3(&#34; launchjob.pl&#34;。$ bindir。&#34;&#34;。$ ddir。&#34;&#34;。$ jid。&#34;&#34;。 $ CMD);
这似乎已经解决了。