0

因此,我在 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>
4

1 回答 1

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: No such file or directory 错误。

系统('launchjob.pl',$bindir,$ddir,$jid,$cmd);

相反,我使用了以下似乎按预期运行的内容。

使用 IPC::Run3;run3("launchjob.pl ".$bindir." ".$ddir." ".$jid." ".$cmd);

这似乎已经解决了。

于 2016-09-08T23:06:46.047 回答