使用mod_perl的Proc :: Daemon不会写STDOUT或STDERR

时间:2016-09-08 01:11:41

标签: linux perl apache2 mod-perl2 mod-perl-registry

我在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>

1 个答案:

答案 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);

这似乎已经解决了。