2012-02-12 10 views
3

を終了するのを待っている:のperl:複数のシステムの処理を実行し、それらが現在の私のPerlスクリプトで、私は次のような呼び出しを行う

system(" ./long_program1 & ./long_program2 & ./long_program3 & wait "); 

私は時に実行時間の長いコマンドの各ログインできるようにしたいと思いますそれらを非同期的に実行しながら実行する。私はシステムコールがperlにフォークを引き起こすことを知っています。そういうことが可能ですか?これは、複数のperl fork()とexec()呼び出しで置き換えることができますか?

より良い解決策をお探しください。

+0

あなたは終わりの時またはちょうど開始時間をログに記録しますか?プロセスが開始されたときにどのような情報を記録したいのですか、プロセスが終了したときにどのような情報を記録したいですか? – ikegami

答えて

6

はい、間違いありません。実行するプログラムごとに子プロセスをフォークオフすることができます。

あなたは

foreach my $i (1, 2, 3) { 
    my $pid = fork(); 
    if ($pid==0) { # child 
     exec("./long_program$i"); 
     die "Exec $i failed: $!\n"; 
    } elsif (!defined $pid) { 
     warn "Fork $i failed: $!\n"; 
    } 
} 

1 while wait() >= 0; 
(Execは() system(); exit $rc;と機能的に非常に似ているので)、あなたのPerlコードは、システムコールが終了した後に何をしたいどのくらいの処理に応じて、フォーク後 system()または exec()を行うことができますいずれか

多くのフォークを行う必要がある場合は、手でフォークするのではなく、Parallel::ForkManagerでコントロールするほうがよいことに注意してください。

+0

'exec'は' system'と 'exit'とでは多くの点で同等です。 (実際には 'system'は' exec'を使用しています) – ikegami

+0

@ikegami - メインとあまり関連していなかったので、私はあまり単純化しませんでした。Q re-word – DVK

3

つの選択肢:それはそれは些細なfork + execよりも短いですし、それがコマンドにexecエラーをmisattributeていないので、あなたは些細なfork +のように起動するので、私はopen3を使用


use IPC::Open3 qw(open3); 

sub launch { 
    open(local *CHILD_STDIN, '<', '/dev/null') or die $!; 
    return open3('<&CHILD_STDIN', '>&STDOUT', '>&STDERR', @_); 
} 

my %children; 
for my $cmd (@cmds) { 
    print "Command $cmd started at ".localtime."\n"; 
    my $pid = launch($cmd); 
    $children{$pid} = $cmd; 
} 

while (%children) { 
    my $pid = wait(); 
    die $! if $pid < 1; 
    my $cmd = delete($children{$pid}); 
    print "Command $cmd ended at ".localtime." with \$? = $?."\n"; 
} 

exec


use threads; 

my @threads; 
for my $cmd (@cmds) { 
    push @threads, async { 
     print "Command $cmd started at ".localtime."\n"; 
     system($cmd); 
     print "Command $cmd ended at ".localtime." with \$? = $?."\n"; 
    }; 
} 

$_->join() for @threads; 
+0

複数のスレッドではなく、このような状況では? – Blaskovicz

+0

@Blaskovicz、プロセスの代わりにスレッドを使用しません。それはまったく同じプロセスを起動します。 2番目のスニペットのコードの利点は、最初のスニペットのコードよりも明らかです。 – ikegami

+0

オプションを使用しているスレッドは美しく、きれいで、扱いやすいです!ありがとう! – Balthasar

関連する問題