2017-08-30 1 views
-1

Ich habe 24 Aufgaben (Unix-Befehle) in der Liste (Datei). Sie müssen zur gegebenen Zeit von 5 ausgeführt werden. Wenn eine Aufgabe abgeschlossen ist, sollte das Skript die nächste ausführen, bis alle 24 Aufgaben ausgeführt/konkurriert sind. Im Vordergrund habe ich eine while-Schleife mit "ps" -Befehl, um die Aktivität zu überwachen. Irgendwelche Ideen?perl: Ausführen von Unix-Prozessen und Überwachung von ihnen per Perl

+1

Die Funktion, nach der Sie suchen, ist die Prozessdrosselung. Schau dir ein Modul an wie zB 'Parallel :: ForkManager' (http://metacpan.org/pod/Parallel::ForkManager) oder [Forks :: Super'] (http://metacpan.org/pod/Forks) ::Super). – mob

+2

GNU Parallel ist ein Perl-Programm, das genau das tut, was Sie wollen. – amon

Antwort

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

Sie können Informationen aus Ihrer Prozessüberwachung erhalten mit Proc::ProcessTable

Dies ist ein Beispiel:

#!/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"; 
    } 
} 

Wenn ich ist Windows mit, vielleicht können Sie Win32 :: Process verwenden * Module . Aber ich habe nie benutzt!