1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| use Win32::Process;
use Win32;
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
my $perl_exe = "C:\\perl\\bin\\perl.exe";
my $cmd_script_1 = "perl Multi_Process_script_1.pl 15";
my @durees_p1 = (12,13,7,3); # 4 scénario différents pour le processus 1
my $temps_max = 10; # Le processus 1 ne doit pas dépasser ce temps en sec
Win32::Process::Create($ProcessObj_1,$perl_exe,$cmd_script_1,0,NORMAL_PRIORITY_CLASS,".")|| die ErrorReport();
my $heure_debut = time; # heure de début de fonctionnement du processus 1
my $pid_1 = $ProcessObj_1->GetProcessID(); # On récupère le pid pour pouvoir tuer le processus
my $cpt = 0; # Compteur pour avancer dans les scénario
BOUCLE: # Boucle qui relance le script 1 tant qu'il ne s'est pas exécuté en moins de $temps_max
while( 1 == 1 ) {
my $heure_cour = time; # heure courante
my $duree_sec = $heure_cour - $heure_debut;
print "duree_sec=$duree_sec\n";
my $exitcode;
$ProcessObj_1->GetExitCode( $exitcode )."\n"; # Je base mon test de fin du processus sur la valeur de $exitcode
if( $exitcode !=0 ) {
if( $duree_sec > $temps_max) { # Le délai du processus 1 est dépassé
print "Delai depasse - Fin du processus 1\n";
$ProcessObj_1->Kill( $exitcode ); # On arrête le processus 1
print "Lancement du processus 1 a nouveau\n";
$cmd_script_1 = "perl Multi_Process_script_1.pl $durees_p1[$cpt]"; # On relance processus 1 mais avec une autre durée
Win32::Process::Create($ProcessObj_1,$perl_exe,$cmd_script_1,0,NORMAL_PRIORITY_CLASS,".")|| die ErrorReport();
$heure_debut = time; # On réactualise l'heure de début du processus 1
$cpt++; # On passe au scénario suivant
}
else {
print "Le processus 1 pid=$pid_1 tourne depuis $duree_sec secondes\n"; # Le délai du processus 1 n'est pas dépassé
}
}
else {
print "Le processus 1 ne tourne plus\n"; # Le processus 1 s'est terminé en moins de $temps_max
last BOUCLE;
}
sleep 1;
}
# On lance le processus 2 lorsque le processus 1 a fini par faire son exécution en un temps < $temps_max
my $cmd_script_2 = "perl Multi_Process_script_2.pl";
Win32::Process::Create($ProcessObj_2, $perl_exe, $cmd_script_2, 0, NORMAL_PRIORITY_CLASS, ".")|| die ErrorReport(); |
Partager