2012-11-07 4 views
3

J'ai un problème avec un script que j'ai créé. Ceci est la première fois que j'utilise le signal que je voudrais que mon script à exécuter comme un démon, donc je mis plusieurs signaux Handler pour mettre fin correctement mon script:Erreur SIG lors de la destruction globale

local $SIG{HUP} = \&StopSuperviser; 
local $SIG{INT} = \&StopSuperviser; 
local $SIG{QUIT} = \&StopSuperviser; 
local $SIG{ILL} = \&StopSuperviser; 
local $SIG{ABRT} = \&StopSuperviser; 
local $SIG{TERM} = \&StopSuperviser; 

Cela fonctionne correctement, mais quand j'envoie un de ces signal mon script (Crt-C, kill -15, kill -1 ...) la fonction StopSuperviser est correctement appelé mais je reçois toujours l'erreur suivante dans la sortie de mon script:

Argument "HUP" n » t numérique en opération nulle lors de la destruction globale.

J'ai cherché sur google mais je n'ai trouvé aucun problème concernant ce comportement.

Quelqu'un peut-il mettre de la lumière là-dedans?

Merci beaucoup pour votre aide

Cordialement

Florent

#

Merci quatre vos réponses, voici la StopSuperviser Fonction:

sub StopSuperviser 
{ 
    print "On quite\n"; 
    $StopAlarm = 1; 
    &DeleteThreadOrder($AllProcess); 
    foreach my $Subprocess (@$AllProcess) { 
     foreach my $thread (@{$Subprocess->{Thread}}) { 
      $thread->kill('USR1'); 
      $thread->join(); 
     } 
    } 
    exit; 
} 

J'utilise aussi le paquet suivant:

use Alarm::Concurrent; 

Cela peut important de savoir, ou non :) Hope this aide :)

Merci encore pour votre réponse et aider

Cordialement

Florent

+2

S'il vous plaît nous montrer le contenu de 'sous StopSuperviser'. – pndc

+0

Bon point, @Peter, peut-être qu'il abuse de '$ _ [0]'. – ikegami

+0

@ikegami C'était mon soupçon, mais nous devons voir le code pour être sûr. – pndc

Répondre

0

j'avais ce problème plus tôt cette année, et a fini par trouver la solution sur PerlMonks, mais je ne peux pas trouver le lien maintenant. Je mettrai à jour si je le rencontre. Leur explication était beaucoup plus détaillée que ce que je présente ici.

Il est l'expression d'une fonction décrite dans perlsub:

Si un sous-programme est appelé en utilisant le formulaire &, la liste des arguments est en option, et si elle est omise, aucun tableau @_ est mis en place pour la sous-programme: le tableau @_ au moment de l'appel est visible à la sous-routine à la place.

Si ma mémoire est bonne, vous devriez être en mesure de le réparer en changeant:

local $SIG{HUP} = \&StopSuperviser; 

à

local $SIG{HUP} = sub { StopSuperviser() }; 
+0

Bonjour, Merci beaucoup pour votre aide. J'ai changé mon code comme vous l'avez suggéré mais cela n'a pas résolu mon problème. Je serai heureux de lire la solution que vous avez trouvée sur Perlmonks si vous la trouvez à nouveau;) – ehretf

+0

La réponse que vous cherchez peut-être ici: http://www.perlmonks.org/bare/?node_id=107372 – GraduateOfAcmeU

Questions connexes