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