我有一个应该在后台做一些工作的 Perl 脚本。这很好地描述了 - 我分叉,杀死(返回0)父母并在孩子身上完成工作。当我直接从外壳运行它时,它按预期工作(即在杀死父级后立即返回外壳并继续在后台运行)。但是如果我从另一个环境运行它,例如从 PHP 通过执行
php -r "passthru('my-perl-script.pl')"
孩子完成后它返回到外壳。任何想法为什么会发生这种情况?
谢谢!
编辑:这是我使用的 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 只是一个示例)。
谢谢!