Perl的system()启动一个进程,但打破了父/子关系?
test.pl:
use POSIX; system("./test.sh &"); my $pid = `ps -C test.sh -o pid=`; print "pid: -$pid-\n"; waitpid($pid,0);
test.sh:
while true do sleep 1 done
当我运行test.pl时,它会找到并打印一个正确的test.sh.但是waitpid()返回-1并且test.pl退出. test.pl存在后,test.sh仍在运行.
看起来test.sh不是test.pl的子代,它会破坏waitpid().为什么会发生这种情况以及如何使system()表现出来?这是因为Perl会自动清除孩子吗?如果是,我该如何解决明确等待儿童的一般任务?
更新:
下面的答案建议使用fork / exec.最初的问题是:
>从Perl脚本中,运行启动服务的命令行实用程序.该实用程序退出但服务仍然存在.
>过了一段时间,找到服务的pid并等待它.
解决方法
test.sh进程不是您的子进程. system()分叉了一个shell(它是你的孩子),该shell分叉了一个运行test.sh程序的子代.你孩子的外壳退出了.