2017-09-12 3 views
-1

J'ai un script qui se comporte mal à l'occasion lors de la communication avec un serveur web. Le serveur se bloque ou est très lent à répondre avec des données.Alerte Perl() ou Time :: Out Without Kernel SIG

J'utilise actuellement alarm() comme un hack pour terminer le script afin de ne pas inonder le système de threads, mais cela provoque une erreur cron, qui alerte le sysadmin, qui ne veut vraiment pas les 200 emails Cela produit lorsque le système est tombé.

Existe-t-il une méthode alternative pour terminer un script (ou apiQuery, si nécessaire) qui ne provoquera pas une sortie non-OK et l'email correspondant?

+4

pouvez-vous poster votre code? Ensuite, nous pouvons probablement vous aider avec une solution. –

+3

ou au moins ajouter un [mcve] si le code est vraiment grand –

+0

(1) oui. (2) lequel voulez-vous? // Sérieusement, veuillez compléter votre question avec plus d'informations. Du code en premier lieu. – zdim

Répondre

-1

Vous pouvez lever une exception dans votre gestionnaire de signal, et l'attraper ailleurs.

my $success = eval { 
    local $SIG{ALRM} = sub { die "Failure" }; 
    alarm 10; 
    do_something_long(); 
    alarm 0; 
    1; 
}; 
if (!$success) { 
    warn "Timeout!\n" if $verbose; 
    exit 0; 
} 
+0

merci, je vais vous donner un coup de feu ce . Je vois SIG {ALRM} là-dedans cependant. Cela va-t-il encore provoquer une alarme du noyau? C'est ce que j'essaie d'éviter. Toutes mes excuses pour les questions noob. J'ai hérité de ce script perl et je connais très peu perl. –

+0

Il attrape le signal, donc votre programme n'en meurt pas –

+0

Fonctionne parfaitement, merci :) –