当从另一个环境中调用时,在后台运行Perl



我有一个Perl脚本,应该在后台做一些工作。这是很好的描述-我fork, kill(返回0)父进程,并在子进程中执行工作。当我直接从shell中运行它时,它按预期工作(即在杀死父进程后立即返回shell并继续在后台运行)。但如果我在另一个环境中运行,比如在PHP中执行

    php -r "passthru('my-perl-script.pl')"

在子进程完成后返回shell。知道为什么会这样吗?

谢谢!

编辑:下面是我使用的Perl代码:

#!/usr/bin/env perl
use strict;
use warnings;
local $| = 1;
# fork the process - returns child pid to the parent process and 0
# to the child process
print ' [FORKING] ';
my $pid = fork();
error('Failed to fork: $@') and exit 1 if $@;
# exit parent
print ' [KILLING PARENT] ';
exit 0 if $pid;
# continue as child process
print " [CONTINUING AS CHILD] n";
# wait 3 secs (for testing) and exit
sleep 3;
print " [DONE]n";
exit 1;

直接执行时的输出:

$ ./background-test.pl
 [FORKING]  [KILLING PARENT]  [KILLING PARENT]  [CONTINUING AS CHILD]
$  [DONE] 

通过PHP执行的输出:

$ php -r "system('./background-test.pl');"
$ [FORKING]  [KILLING PARENT]  [KILLING PARENT]  [CONTINUING AS CHILD]
  # ... 3 seconds wait ... 
  [DONE]
$

我的问题是为什么从其他环境调用Perl脚本时不断开连接(这里PHP只是一个例子)。

谢谢!

如果我理解正确的话,您的意思是PHP正在等待孙子进程结束,即使子进程已经退出。

system不返回,因为php收集子代的STDOUT,即子代继承的STDOUT。在Linux系统上,可以通过向Perl脚本添加以下内容来实现:

system("ls -l /proc/$$/fd");
从壳:

lrwx------ 1 ikegami ikegami 64 Jun  1 14:07 1 -> /dev/pts/0
从PHP:

l-wx------ 1 ikegami ikegami 64 Jun  1 14:08 1 -> pipe:[10052926]

通常,当你demononize一个进程,你重新打开它的STDIN, STDOUT和STDERR,重定向到/dev/null或日志文件。

open(STDIN,  '<',  '/dev/null') or die $!;
open(STDOUT, '>',  '/dev/null') or die $!;
open(STDERR, '>>', '/var/log/application.log') or die $!;

通常,当您对进程进行demononize时,您也可以调用POSIX::setsid()

相关内容

  • 没有找到相关文章

最新更新