120 votes

Dans quel ordre dois-je envoyer des signaux à d'gracieusement arrêt du processus?

Dans un commentaire sur cette réponse à une autre question, l'intervenant a dit:

n'utilisez pas de kill -9, sauf si absolument nécessaire! SIGKILL ne peut pas être pris au piège, de sorte les tués programme ne peut pas exécuter n'importe quel l'arrêt des routines, par exemple effacer les fichiers temporaires. Essayez d'abord de l'HUP (1), alors INT (2), puis QUITTER (3)

Je suis d'accord en principe sur SIGKILL, mais le reste est nouvelles pour moi. Étant donné que la valeur par défaut du signal envoyé par kill est SIGTERM, je dirais que c'est la plus communément signal attendu pour un arrêt progressif de l'arbitraire d'un processus. Aussi, j'ai vu SIGHUP utilisé pour la non-terminaison de raisons, comme dire à un démon "re-lire votre fichier de configuration." Et il me semble qu' SIGINT (de la même interruption, vous devez généralement obtenir avec Ctrl-C, à droite?) n'est pas aussi largement pris en charge comme il se doit, ou se termine plutôt ungracefully.

Étant donné qu' SIGKILL est un dernier recours, — les signaux Qui, et dans quel ordre, si vous envoyez à un processus arbitraire, afin de l'arrêter avec autant de tact que possible?

Veuillez justifier vos réponses avec faits à l'appui (au-delà de préférence personnelle ou d'opinion) ou des références, si vous le pouvez.

Note: je suis particulièrement intéressé par les meilleures pratiques qui comprennent l'examen de bash/Cygwin.

Edit: jusqu'à présent, personne ne semble en parler, INT ou CESSER de fumer, et il est rarement fait mention de l'HUP. Est-il une raison de les inclure dans un processus ordonné de tuer?

163voto

lhunath Points 27045

SIGTERM raconte une application pour terminer. Les autres signaux de dire à l'application d'autres choses qui ne sont pas liés à l'arrêt, mais peut parfois avoir le même résultat. Ne pas utiliser ceux. Si vous voulez une application pour arrêter, de lui dire de. Ne lui donnez pas trompeuses.

Pourquoi donc beaucoup semblent penser qu'un seul signal est nécessaire pour transmettre le message au-delà de moi. Si SIGTERM n'est pas arrêter instantanément, c'est parce que l'application a choisi de traiter le signal. Ce qui signifie qu'il a une très bonne raison de ne pas mettre fin immédiatement: un peu de nettoyage à faire. Si vous ne le permet pas pour finir que, on ne sait pas comment il va se comporter la prochaine fois que vous démarrez ou comment une grande partie de sa persistante de données que vous venez de corrompu.

Pour plus d'informations sur la signification réelle des signaux, voir sigaction(2). Et ne pas confondre "Action par Défaut" avec "Description", ils ne sont pas la même chose.

IMO c'est seulement typique pour les auteurs de mauvais scripts pour envoyer des SIGKILL. Et oui, mauvaise scripts sont partout.

Ne pas envoyer de signal SIGKILL. Jamais. Si l'application gère le signal SIGTERM, il peut prendre une seconde pour le nettoyage, il peut prendre une minute, il peut prendre une heure. En fonction de ce que l'application doit être fait avant qu'il soit prêt à la fin. Toute la logique qui "suppose" une demande de nettoyage de la séquence a pris assez longtemps et doit être raccourci ou SIGKILLed après X secondes est tout simplement faux.

La seule raison pour laquelle une application aurait besoin d' un SIGKILL de résilier, si quelque chose a été si horriblement mauvais que quelque chose buggé pendant son nettoyage de la séquence. Dans ce cas, vous pouvez ouvrir un terminal et SIGKILL manuellement. En dehors de cela, vous avez vraiment ne devrait jamais rencontrer, sauf si vous êtes l'un développement de l'application, la seule autre raison pour laquelle vous feriez SIGKILL quelque chose c'est parce que vous voulez l'empêcher de nettoyage lui-même; dans ce cas, vous ne voulez pas le signal SIGTERM d'abord et après un délai d'attente de SIGKILL.

Ce n'est pas parce que la moitié de la consommation mondiale de SIGKILL après 5 secondes qu'il n'est pas horriblement mauvais.

8voto

dwc Points 12676

En général, vous souhaitez envoyer un SIGTERM, la valeur par défaut de les tuer. C'est la valeur par défaut pour une raison. Seulement si un programme ne signifie pas l'arrêt dans une quantité raisonnable de temps devez-vous recourir à SIGKILL.

Comme pour SIGHUP, HUP est l'acronyme de "raccrocher" et historiquement signifie que le modem est déconnecté. C'est essentiellement équivalent à SIGTERM. La raison que les démons utilisent parfois SIGHUP à redémarrer ou recharge la configuration est que les démons se détacher de tout contrôle des terminaux et, par conséquent, n'auraient jamais recevoir SIGTERM, de sorte que le signal a été considéré comme "libéré" pour une utilisation générale. Pas tous les démons de l'utiliser pour recharger! L'action par défaut pour SIGHUP est de mettre fin et de nombreux démons se comporter de cette façon! Donc vous ne pouvez pas aller à l'aveuglette envoi HUPs de démons et d'attendre qu'ils survivent.

Edit: SIGINT est probablement inapproprié de mettre fin à un processus, comme c'est normalement liée à ^C ou quel que soit le terminal est pour interrompre un programme. De nombreux programmes de capture pour leurs propres fins, de sorte qu'il est assez commun pour elle de ne pas travailler. SIGQUIT a généralement le défaut de la création d'un core dump, et, sauf si vous voulez fichiers de base autour de la pose c'est pas un bon candidat.

Résumé: si vous envoyez le signal SIGTERM et le programme ne meurt pas dans votre calendrier, puis de l'envoyer SIGKILL.

7voto

vartec Points 53382

SIGTERM signifie, en réalité, l'envoi d'une demande d'un message: "voulez-vous avoir la gentillesse et le suicide". Il peut être piégé et traitées par l'application pour exécuter le nettoyage et le code d'arrêt.

SIGKILL ne peuvent pas être capturés par l'application. L'Application se fait tuer par l'OS sans aucune chance pour le nettoyage.

Il est typique pour envoyer des SIGTERM d'abord, le sommeil un certain temps, puis envoyez SIGKILL.

4voto

gbarry Points 3813
  • SIGTERM est équivalent à "en cliquant sur le" X "" dans une fenêtre.
  • SIGTERM est ce que Linux utilise tout d'abord, quand il s'arrête.

0voto

innaM Points 22831

HUP sonne comme de la foutaise pour moi. Je voudrais l'envoyer à obtenir un démon à relire son fichier de configuration.

SIGTERM peuvent être interceptées; vos démons venez peut-être de nettoyer le code à exécuter quand il reçoit ce signal. Vous ne pouvez pas le faire pour SIGKILL. Ainsi, avec SIGKILL vous ne donnez pas le démon est l'auteur d'options.

Plus sur que sur Wikipédia

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X