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 の正しい pid が検出され、出力されます。しかし、waitpid() は -1 を返し、test.pl は終了します。test.pl が存在した後、test.sh はまだ実行されています。
test.sh は test.pl の子ではないようで、waitpid() が壊れます。なぜこれが起こるのか、system() を動作させる方法は? これは、Perl が子を自動的にクリアするためですか? はいの場合、子供を明示的に待機する一般的なタスクをどのように解決できますか?
アップデート:
以下の回答では、fork/exec の使用を提案しています。最初の問題はこれです:
Perl スクリプトから、サービスを開始するコマンドライン ユーティリティを実行します。ユーティリティは終了しますが、サービスは残ります。
しばらくしてから、そのサービスの pid を見つけて待機します。
fork/exec はこれを解決しませんが、問題は解決します。