Comment signaler une application sans le tuer dans Linux?
J'ai un chien de garde de l'application. Il regarde mon application principale qui peut tomber en panne pour une raison ou une autre (je sais que c'est mauvais, mais ce n'est pas le point).
J'ai programmé ce chien de garde pour accepter les signaux SIGUSR1 pour arrêter le suivi de ma demande de présence. Je signal avec
kill -SIGUSR1 `pidof myapp`
Cela fonctionne vraiment bien. Mon problème c'est quand j'essaie de le signal d'une ancienne version de la surveillance qui ne dispose pas de cette fonctionnalité intégrée. Dans ce cas, le signal kill tue le chien de garde (termine le processus), ce qui conduit à des complications supplémentaires (le redémarrage de l'appareil).
Est-il un moyen de signaler mon chien de garde avec SIGUSR1 de sorte qu'il ne met pas fin si ce signal n'est pas gérée?
- "...Je sais que c'est mauvais, mais ce n'est pas le point" - Vous mettre du lait jusqu'à mon nez 🙂 +1 pour l'.
Vous devez vous connecter pour publier un commentaire.
De la GNU docs au sujet de traitement de signal:
L'action par défaut pour SIGINFO est de ne rien faire, de sorte qu'il peut être plus approprié:
SIGHUP est émis lorsque le terminal de contrôle est fermé, mais puisque la plupart des démons ne sont pas attachés à un terminal, il n'est pas rare de l'utiliser comme "recharger":
BTW, votre chien de garde pouvait lire un fichier de config de temps à autre afin de savoir si elle devrait relancer le processus.
Mon favori personnel pour un chien de garde est superviseur.
Voir si
kill -l
retourne la liste des signaux sur votre plate-forme et d'essayer certains d'entre eux, mais SIGUSR1 ressemble à un mauvais choix.[Mise à JOUR]
Carpetsmoker commentaires sur les différences de comportement entre Linux et Bsd:
SIGINFO
semble fonctionner différents sur GNU libc & BSD; sur BSD, il fonctionne comme vous le décrivez, mais sur Linux, il n'existe pas, ou est le même queSIGPWR
... La GNU libc manuel semble incorrecte dans ce domaine (votrekill -l
la sortie ne montre pasSIGINFO
)... je ne sais pas pourquoi GNU ne le supporte pas, parce que je trouve que c'est très utile...L'action par défaut lors de la réception d'un signal SIGUSR1 est d'y mettre fin si le gestionnaire n'est pas présent. Ce qui signifie que vous ne pouvez pas faire ce que vous voulez que le signal de plus.
Court de mise à jour du chien de garde, il n'y a rien que vous pouvez faire (et je suis en supposant que vous êtes incapables de faire la différence chien de garde versions dans le programme avant d'envoyer le signal).