2010-07-15 22 views
2

J'ai un script Perl assez simple, que dans une fonction effectue les opérations suivantes:script Perl est se faire tuer pendant le sommeil()

if (legato_is_up()) { 
     write_log("INFO:  Legato is up and running. Continue the installation."); 
     $wait_minutes = $WAITPERIOD + 1; 
     $legato_up = 1; 
    } 
    else { 
     my $towait = $WAITPERIOD - $wait_minutes; 
     write_log("INFO:  Legato is not up yet. Waiting for another $towait minutes..."); 
     sleep 30; 
     $wait_minutes = $wait_minutes + 0.5; 
    } 

Pour une raison quelconque, parfois (comme 1 en 3 courses) le script obtient tué. Je ne sais pas qui est responsable de la mise à mort, je sais juste que cela arrive pendant l'appel de "sommeil".

Quelqu'un peut-il me donner un indice ici? Après le script est tué, son travail n'est pas fait, ce qui est un gros problème.

Merci.

+0

est-ce que cela est exécuté depuis la console ou depuis Apache? si c'est à partir d'Apache, jetez un coup d'œil à l'option timeout ... il pourrait également y avoir une erreur quelque part dans vos fonctions que vous ne traitez pas et puisque nous ne voyons pas le reste du code que nous ne pouvons pas vraiment dire. Si vous appelez depuis le navigateur et que vous utilisez Apache ou similaire, vous pouvez aussi vérifier le journal error_log et voir s'il contient quelque chose qui pourrait vous aider ... – Prix

+0

il est exécuté à partir de la console. Le script fait partie de l'encapsuleur d'installation, qui est utilisé pour installer un logiciel simple. Le script s'exécute en dernier et son but est de vérifier que le logiciel est en place (c'est ce que legato_is_up() fait). Le système d'exploitation est Red Hat AS3, avec une distribution standard. – Alex

+0

Êtes-vous, par hasard, sur Dreamhost? Ils ont tendance à tuer les processus persistants. – Schwern

Répondre

1

Sans savoir quoi d'autre est en cours d'exécution sur votre système, il est quiconque conjecture. Vous pouvez ajouter un gestionnaire de signal, mais tout ce qu'il vous dira est que le signal était (et quand), mais pas qui l'a envoyé:

foreach my $signal (qw(INT PIPE HUP)) 
{ 
    my $old_handler = $SIG{$signal}; 
    $SIG{$signal} = sub { 
     print time, ": ", $signal, " received!\n"; 
     $old_handler->(@_) if $old_handler; 
    }; 
} 

Vous pouvez également envisager d'ajouter un gestionnaire WARN et DIE, si vous ne vous connectez pas à la sortie de stderr.

+0

il n'y a rien d'autre. J'ai un certain nombre d'autres scripts utilisant l'appel de sommeil, mais seulement celui-ci est tué ... – Alex

+0

N'y a-t-il pas un module Perl pour la gestion de signal avancée, qui * peut * vous dire qui a envoyé le signal? –

+2

@Zan Je ne pense pas que Unix rende cette information disponible. Jetant un coup d'œil à travers les documents de la bibliothèque GNU C sur la gestion du signal, leur gestionnaire obtient simplement le numéro du signal. http://www.gnu.org/s/libc/manual/html_node/Basic-Signal-Handling.html – Schwern