如何使用mod_perl2正确分叉?

Dan*_*Dan 7 perl mod-perl2

我在从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";
}
Run Code Online (Sandbox Code Playgroud)

回到mod_perl1天,我记得用它$r->cleanup_for_exec来解决这个问题,但是mod_perl2似乎没有支持它.(编辑:显然它不再需要..)

如果没有这些问题从mod_perl2正确启动长时间运行过程的任何建议将不胜感激!

Leo*_*ans 2

您可能想阅读讨论。看来你不应该 fork mod_perl 除非你知道如何准备东西。您必须使用诸如Apache2::SubProcess之类的模块