Voici mon code, avec la manipulation des erreurs et d'autres trucs supprimés pour plus de clarté:
sub monitor($) { my ($timeout) = @_; sleep $timeout; # check if script is still running and if so get pid from pidfile if (...) { my $pid = getpid(...); kill 9, $pid; } }
4 Réponses :
En général, je ne pense pas que vous puissiez s'attendre à ce que les signaux soient propagés à tous les processus enfants; Ce n'est pas spécifique à Perl.
Cela dit, vous pourrez peut-être utiliser le processus groupe em> la fonction de signal intégré à Perl Kill () : P> ... Si le signal est négatif, il tue des groupes de processus au lieu de processus ... p>
blockquote> Vous devez probablement utiliser SETPGRP () sur votre ( Direct) Processus enfant, puis changez votre appel à Kill à quelque chose comme: p>
Essayez d'ajouter: en haut de votre launch_and_monitor code> fonction. Cela mettra votre processus dans une session distincte et entraînera la sortie des choses lorsque le chef de session (c'est-à-dire le maître). P> P>
Vous pouvez le faire avec des groupes de processus, si votre système d'exploitation les prend en charge. Vous devez rendre le processus de script devenir un chef de groupe de processus. L'enfant traite son rôle héritera du groupe de processus de leur parent. Vous pouvez ensuite utiliser Kill pour envoyer un signal à chaque processus du groupe en même temps.
in plus tard, pour tuer le processus de script et ses enfants, nier l'ID de processus que vous signalez: P> lancement () code>, vous devrez remplacer la ligne
Ouvrir code> avec celui qui fourchette. Ensuite, dans l'enfant, vous appelleriez
setpgrp () code> avant exécuteur la commande. Quelque chose comme ce qui suit devrait fonctionner: p>
kill 9, -$pid;
Je pense que vous devriez nier le numéro de signal (ou le nom) et non le PID: tuer '-9', $ pid code>.
tuer un groupe de processus fonctionne, mais n'oubliez pas que le parent peut être tué seul aussi. En supposant que les processus d'enfants ont une boucle d'événement, ils peuvent vérifier la prise mère créée dans un socketpair avant de faire la fourchette () pour la validation. En fait, SELECT () SELECT () SELECTS SORTISSEMENT Lorsque la prise mère est partie, tout ce qui doit être effectué est de vérifier la prise.
par exemple: p> fonctionne comme ceci : p>
Je n'ai pas de réponse à votre question principale, mais je vous recommanderais de faire
Reaper CODE> UN SUB ANONYMOUS, E.G.
My $ Reauper = Sub {...}; $ SIG {CHLD} = $ RELAPER; CODE> Mettre un sous-nommé sous un autre sous ne le cache pas d'autres étendues. Tous les sous-marins nommés sont des symboles de paquet à Perl
spéculation.org/garrick/kill-9.html
bon point, merci d'avoir souligné ça