Bonjour
J'ai besoin de lancer une commande avec la fonction system() pour vérifier son code de retour.
J'ai aussi besoin de mettre un timeout sur cette appel pour tuer le processus
J'ai essayé :
mais cela créé des zombies
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 eval { local $SIG{ALRM} = sub { die "Alarm" }; alarm($getconfs_timeout); system("toto") == 0 || &failexec("Unable to execute\n",$?); alarm(0); }; if ($@ and $@ =~ /Alarm/) { &timeoutexec("Timeout sent\n"); } else {
existe t'il un moyen simple (sans install de librairies) pour faire celà ?
j'imagine que le fork est obligatoire mais je les maitrise pas très bien
j'ai essayé çà mais celà n'est pas concluant (je ne sais pas comment tuer un des fils quand l'autre est fini)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #!/usr/bin/perl $timeout=30; &NewPid(); sub NewPid(){ defined($pid1 = fork) or die "Pas de fork1 possible : $!"; defined($pid2 = fork) or die "Pas de fork2 possible : $!"; unless($pid1){ print "Lancement sh\n"; exec("/var/www/html/outilsecurite/script/cdegetconfs.sh"); exit 0; } unless($pid2){ $time=$timeout; while($time>0) { system("cls"); print "Il vous reste: $time secondes\n"; $time=&Decompte($time); } exit 0; } waitpid($pid2, 0); waitpid($pid1, 0); } sub Decompte(){ $decompte=$_[0]; $decompte=$decompte-1; sleep(1); return $decompte; }
Partager