2016-08-24 12 views
0

私は以下に述べるようなスクリプトを持っていますが、「実行する必要のあるコマンド」(forループ内)というコマンドがある時間実行され、 forkしてコマンドを実行すると、 "実行する必要のあるコマンド"(forループ内)のスクリプトの一部だけが実行されます。代わりに、私は "実行する必要のあるコマンド"(forループ)がすべて並列に実行されるようにします。つまり、forループが50回繰り返し実行される場合、50種類のプロセスを並列に実行する必要があり、の間に。ある人がこれをお勧めしますか?perlで並列に実行されるコマンドが必要です

#!/usr/bin/perl 

use Expect; 

sub hostuser_expect() { 
    $expect= Expect->new; 
    $expect->raw_pty(1); 
    $expect->spawn($cmd) 
    or die "Cannot spawn $cmd: $!\n"; 

    $expect->expect($timeout, 
      [ qr/.*\?/i, #/ 
      sub { 
        my $self = shift; 
        $self->send("yes\r\n"); 
        exp_continue; 
        } 
      ]); 

    $expect->expect($timeout, 
      [ qr/password:/i, #/ 
      sub { 
        my $self = shift; 
        $self->send("$password\n"); 
        exp_continue; 
      } 
    ]); 
    #$expect->expect(1500,'-re', 'Mails marked as moved successfully\.$'); 
    #$expect->hard_close(); 
} 

$timeout  = 5; 
$password = "changeme"; 

for ($i=1;$i<=50;$i++) { 
    $cmd="Command which needs to be run"; 
    print "Invoking script - $cmd\n"; 
    hostuser_expect(); 
    sleep(30); 
} 

答えて

1

私はParallel::ForkManagerと思っています。私はExpectを使用しないので、例としてsubを単純化しました。また、use strict;use warnings;を追加し、サブ定義からプロトタイプの括弧を削除し、Cスタイルのfor()ループ実装から変更しました。

コールの番号をParallel::ForkManager->new()に変更して、一度に実行するフォークの最大数を増減してください。

use warnings; 
use strict; 

use Parallel::ForkManager; 

sub hostuser_expect { 
    my $num = shift; 
    print "in child $num\n"; 
} 

my $pm = Parallel::ForkManager->new(5); 

COMMANDS: 
for (1..5){ 
    $pm->start and next COMMANDS; 
    hostuser_expect($_); 
    $pm->finish; 
} 

$pm->wait_all_children; 

出力:

in child 1 
in child 2 
in child 5 
in child 3 
in child 4 
+1

これは多くのことを助けた、ありがとう! –

関連する問題