なぜなのかとPerlのシステム()子どものですか?
質問
Perlのシステムを動かしながらプロセスがブの親子関係?
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なので、見つけや版画からの正しいpidのtest.sh.がwaitpid()-1を返します、test.pl 終了します。後test.pl 存在するtest.sh まだ走っています。
のようになtest.sh ではない子どものtest.plは、休憩waitpid().あらかじめご了承ください、どのようにシステム()行動を取るであろうか。とするPerlの子どもクリアしまうのですか?そしてなぜで一般的なタスクを待機中の子どもを明示的に?
更新:
答え以下の利用fork/exec.最初の問題は、この:
からのPerlスクリプトを実行してコマンドラインできるユーティリティを開始するサービスです。記口でのサービスをご利用いただけます。
その後、このサービスのpidを待ちます。
フォーク/execなで解決するものの、クリア最大の問題をもたらしていました。
解決
test.shプロセスでは、あなたの子プロセスではありません。 system()
は(自分の子である)シェルをフォークし、そのシェルは、test.shプログラムを実行した子をフォーク。あなたの子供だったシェルが終了します。
他のヒント
このような何かあなたはおそらく何をしたいです。
my $pid = fork || exec './test.sh';
print "pid: -$pid-\n";
waitpid($pid, 0);
シェルスクリプトが無限ループにあるので、それは永遠に待ちますけど。
一般的には、手動でフォークとexec必要があります おうち。それはあなたがやっている正確に何を決定するのは難しいが、私 あなたがこれをしたいと考えます:
my $pid = fork;
unless($pid){
# child;
exec(qw/sh test.sh/);
}
# parent
...
waitpid $pid, 0;
個人的に、私はAnyEvent子守をさせることを好むます:
my $done = AnyEvent->condvar;
my $pid = fork;
unless( $pid ) { ... }
my $w = AnyEvent->child (
pid => $pid,
cb => sub {
my ($pid, $status) = @_;
warn "pid $pid exited with status $status";
$done->send;
},
);
$done->recv; # control resumes here when child exits
あるいは、より一般的に: http://github.com/jrockway/anyevent- のサブプロセス/ツリー/マスター
さらにLiudvikas'答えを説明するために -
system("./test.sh &")
|
|--> (P) /bin/sh (to run test.sh)
|
|--> (P) test.sh & (still running)
(P) - process
)Perlのシステムコールの子だった/ binに/ shシェルを、fork'ingとtest.shスクリプトを実行した後、終了し、あなたがwaitpidを-1からの戻り値を(取得ます。