2010-08-06 4 views
4

J'ai cherché sur ceci mais il est étonnamment difficile de venir par une réponse directe à ceci (comme php a beaucoup plus d'information sur ce sujet il semble) .. Je dois faire mon manuscrit de Perl après un nombre spécifié de secondes parce que, comme c'est le cas maintenant, ils fonctionnent trop longtemps et obstruent mon système, comment puis-je faire en sorte que l'ensemble du script meurt juste après un certain nombre de secondes?Perl, fait un délai de script après x nombre de secondes?

Je connais des solutions externes pour tuer le script, mais je voudrais le faire depuis le script perl lui-même.

Merci

+0

Voir aussi questio connexes n http://stackoverflow.com/questions/3238118/perl-alarm-working-intermittently – runrig

Répondre

12

perldoc -f alarm:

[[email protected] ~]$ cat t.pl 
#!/usr/bin/perl 

use strict; use warnings; 

use Try::Tiny; 

try { 
     local $SIG{ALRM} = sub { die "alarm\n" }; 
     alarm 5; 
     main(); 
     alarm 0; 
} 
catch { 
     die $_ unless $_ eq "alarm\n"; 
     print "timed out\n"; 
}; 

print "done\n"; 

sub main { 
     sleep 20; 
} 

Sortie:

[[email protected] ~]$ time perl t.pl 
timed out 
done 

real 0m5.029s 
user 0m0.027s 
sys  0m0.000s
+0

merci .. cela m'aide à le comprendre mieux, je ne pouvais pas vraiment enrouler ma tête autour de la fonction d'alarme comme les exemples semblent rares dans la documentation, je vais essayer – Rick

+0

UNE question ... où irait mon code de script? Dans le premier "essayer" support? Je pense que c'est ce qui m'a dérouté sur l'utilisation de l'alarme – Rick

+0

@Rick: Mettez votre code dans la fonction 'main' (ou toute autre fonction nommée de manière appropriée). De cette façon, vous n'avez pas trop de niveaux d'imbrication. –

2

Voir alarm en perldoc:

eval { 
    local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required 
    alarm $timeout; 
    $nread = sysread SOCKET, $buffer, $size; 
    alarm 0; 
}; 
if ([email protected]) { 
    die unless [email protected] eq "alarm\n"; # propagate unexpected errors 
    # timed out 
} 
else { 
    # didn't 
} 
+0

ok ouais J'essayais d'utiliser l'alarme pour autre chose mais je me suis dit qu'il y aurait un moyen de définir un timeout pour tout le script, mais Je suppose que non .. Je vais regarder dans l'alarme plus .. merci – Rick

+1

Il est préférable d'éviter l'utilisation explicite de 'eval' et' $ @ ', car il y a beaucoup de gotchas subtiles. Découvrez [Try :: Tiny] (http://search.cpan.org/perldoc?Try::Tiny) pour l'une des nombreuses alternatives (celle-ci est la plus légère) (et quand je rafraîchis la page, je vois que Sinan utilisé dans sa réponse): D – Ether

+0

C'est un exemple 'perldoc'. –

Questions connexes