Question

J'ai des daemons qui utilisent des fichiers PID pour empêcher l'exécution parallèle de mon programme. Avoir établi un gestionnaire de signal pour piéger SIGTERM et faire le nettoyage nécessaire, y compris le fichier de PID. Cela fonctionne très bien quand je test en utilisant « kill -s SIGTERM #PID ». Cependant, quand je redémarre le serveur les fichiers PID sont toujours suspendus autour de la prévention démarrage des daemons. Je crois comprendre que SIGTERM est envoyé à tous les processus lorsqu'un serveur est en cours d'arrêt. Dois-je être un autre signal piégeage (SIGINT, SIGQUIT?) Dans mon démon?

Était-ce utile?

La solution

Utilisez flock (ou lockf) sur votre pidfile, si elle réussit, vous pouvez réécrire l'pidfile et continuer.

Cette réponse SO a un bon exemple sur la façon dont cela est fait.

Autres conseils

Pas une solution directe, mais il pourrait être une bonne idée de vérifier un processus réel en cours d'exécution avec le pid dans le fichier pid au démarrage et si aucun n'existe, pour nettoyer le fichier périmé.

Il est possible que votre processus devient un SIGKILL avant qu'il ait une chance de nettoyer le fichier pid.

Rappelez-vous que, après l'envoi SIGTERM à tous les processus, le noyau d'attendre un peu de temps (habituellement environ 2 ou 3 secondes), puis envoyer SIGKILL. Vous pouvez constater que dans /etc/rc.d/rc0.d/S01halt ou similaire (peut varier en fonction de votre distribution).

Par exemple, sur mon Fedora 11 vous avez:

action $"Sending all processes the TERM signal..." /sbin/killall5 -15
sleep 2
action $"Sending all processes the KILL signal..."  /sbin/killall5 -9

Donc, si vous n'êtes pas assez rapide, soit d'augmenter le retard, ou assurez-vous que vous êtes plus vite!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top