2017-08-30 1 views
-1

J'ai 24 tâches (commandes Unix) dans la liste (fichier). ils doivent être exécutés par 5 à l'heure donnée. Quand une tâche se termine, le script doit en exécuter un suivant jusqu'à ce que les 24 tâches soient exécutées/en compétition. En attendant au premier plan j'ai une boucle while avec la commande "ps" pour surveiller l'activité. Des idées?perl: Exécution des processus Unix et contrôle de ceux-ci à l'aide de Perl

+1

La fonctionnalité que vous recherchez est la limitation des processus. Découvrez un module comme ['Parallel :: ForkManager'] (http://metacpan.org/pod/Parallel::ForkManager) ou [' Forks :: Super'] (http://metacpan.org/pod/Forks ::Super). – mob

+2

GNU Parallel est un programme Perl qui fait exactement ce que vous voulez. – amon

Répondre

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

Vous pouvez obtenir des informations à partir de votre suivi de processus avec Proc::ProcessTable

Voici un exemple:

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

Si vous êtes sous Windows, vous pouvez peut-être utiliser Win32 :: Process * modules . Mais je n'ai jamais utilisé!