У меня есть скрипт Perl, который должен выполнять некоторую работу на фоне. Это хорошо описано - я fork, kill (return 0) родительский и выполняю работу с дочерним элементом. Когда я запускаю его непосредственно из оболочки, он работает как ожидалось (т. Е. Возвращается в оболочку сразу после убийства родителя и продолжается на фоне). Но если я запустил его из другой среды, например. от PHP через выполнениеPerl на фоне при вызове из другого env
php -r "passthru('my-perl-script.pl')"
он возвращается в оболочку после того, как ребенок сделан. Любые идеи, почему это происходит?
Спасибо!
EDIT: Вот код 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: [email protected]') and exit 1 if [email protected];
# 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 есть j пример).
Спасибо!
Просьба представить миниатюрную демонстрационную версию проблемы. – ikegami
Я добавил образец кода Perl, который использовался для демонстрации проблемы. Спасибо – baa2w