2017-08-30 7 views
-1

私は24個のタスク(unixコマンド)をリスト(ファイル)に持っています。彼らは与えられた時間に5で実行する必要があります。タスクが完了すると、24個のタスクすべてが実行/競合するまで、スクリプトは次のタスクを実行する必要があります。一方、フォアグラウンドでは、 "ps"コマンドでwhileループを実行して、アクティビティを監視します。何か案は?perl:unixプロセスを実行し、perlを使ってそれらを監視する

+1

探している機能はプロセス調整です。 ['Parallel :: ForkManager'](http://metacpan.org/pod/Parallel::ForkManager)や[' Forks :: Super'](http://metacpan.org/pod/Forks)のようなモジュールをチェックしてください。 ::スーパー)。 – mob

+2

GNU Parallelは、あなたが望むものとまったく同じように動作するPerlプログラムです。 – amon

答えて

3
use Parallel::ForkManager qw(); 

my $pm = Parallel::ForkManager->new(5); 
for my $task (@tasks) { 
    $pm->start() and next; 
    my $exit_code = 0; 
    if (!eval { 
     ... 
     return 1; # No exception 
    }) { 
     $exit_code = $! || $? >> 8 || 255; 
     warn([email protected]); 
    } 

    $pm->finish($exit_code); 
} 

$pm->wait_all_children(); 
0

あなたがこれは一例でProc::ProcessTable

であなたのプロセス監視から情報を取得することができます

#!/usr/bin/perl 

use Proc::ProcessTable; 

$ref = new Proc::ProcessTable; 

foreach $proc (@{$ref->table}) { 
    if(@ARGV) { 
    next unless grep {$_ == $proc->{pid}} @ARGV; 
    } 

    print "--------------------------------\n"; 
    foreach $field ($ref->fields){ 
    print $field, ": ", $proc->{$field}, "\n"; 
    } 
} 

you're Windowsを使用している場合は、多分あなたは、Win32を使用することができます::プロセス*モジュール。しかし私は決して使用しなかった!

関連する問題