質問

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.最初の問題は、この:

  1. からのPerlスクリプトを実行してコマンドラインできるユーティリティを開始するサービスです。記口でのサービスをご利用いただけます。

  2. その後、このサービスのpidを待ちます。

フォーク/execなで解決するものの、クリア最大の問題をもたらしていました。

役に立ちましたか?

解決

test.shプロセスでは、あなたの子プロセスではありません。 system()は(自分の子である)シェルをフォークし、そのシェルは、test.shプログラムを実行した子をフォーク。あなたの子供だったシェルが終了します。

他のヒント

このような何かあなたはおそらく何をしたいです。

my $pid = fork || exec './test.sh';
print "pid: -$pid-\n";
waitpid($pid, 0);

シェルスクリプトが無限ループにあるので、それは永遠に待ちますけど。

あなたはPerlが手助けしたくない場合は、

一般的には、手動でフォークと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からの戻り値を(取得ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top