Lorsque vous essayez de mettre fin à un processus pour de bon, quelle option pour «tuer» devez-vous utiliser?

26

Je reçois beaucoup de messages mitigés de la part des gens et je me demandais s'il n'y avait vraiment pas beaucoup de différence dans ce que vous utilisez.

kill 'x'
killall 'x'
kill -9 'x'

Ce sont quelques options que l'on m'a dit d'utiliser jusqu'à présent, mais certaines personnes disent que tuer -9 est juste exagéré, tuer en soi ne fonctionne pas, etc.

Quelqu'un a-t-il des conseils sur celui qui devrait être utilisé dans le cas le plus standard de simplement mettre fin à un processus (et donc à son état également)?

[edit] Je cherche ce qu'il faut utiliser lorsque vous voulez arrêter l'exécution de votre processus afin que vous puissiez en exécuter un nouveau, frais dès le début

Chuck testa
la source
1
Voir également la lettre type UUK9 qui met en garde contre les abus SIGKILL.
jw013
1
Pour lister tous les différents signaux, ainsi que leur numéro: kill -let pour traduire un numéro en son nom de signal correspondant, par exemple kill -l 9, reviendra KILL.

Réponses:

24

Il existe un certain nombre de signaux dont la disposition par défaut est de mettre fin au processus. Le signal de terminaison ultime est SIGKILL car il ne peut pas être géré et le processus n'a d'autre choix que de mourir. Cependant, cela signifie également que si vous l'envoyez, le processus est privé de toute possibilité de nettoyage. Par conséquent, les bonnes manières nécessitent d'envoyer un signal comme SIGTERM qui peut être traité en premier et uniquement si le processus ne se termine pas après un certain temps, envoyez-le SIGKILL.

Notez que SIGINT et SIGQUIT ne sont pas de bons candidats pour l'arrêt de processus arbitraire. Étant donné qu'ils peuvent être générés à partir du clavier du terminal, de nombreuses applications les utilisent à des fins spéciales. Par exemple, l'interpréteur python utilise SIGINT pour générer une KeyboardInterruptexception (également dans les sessions python interactives où il revient simplement à l'invite) et JVM utilise SIGQUIT pour vider les traces de pile. SIGINT et SIGQUIT restent efficaces pour la plupart des utilitaires de ligne de commande standard comme findou cat.

Pendant l'arrêt du système, la plupart des systèmes UNIX et Linux envoient SIGTERM à tous les processus, suivi d'une attente de 5 secondes, suivi de SIGKILL. Il s'agit de la méthode recommandée pour arrêter en toute sécurité un processus arbitraire.

Notez également que même SIGKILL peut ne pas terminer un processus bloqué dans une attente ininterrompue jusqu'à ce que le processus se réveille.

Adam Zalcman
la source
1
Excellente réponse. Avez-vous une référence pour la kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;recommandation?
l0b0
+1 type de réponse. Et qu'en est-il de SIGHUP?
Alois Mahdal
2
@AloisMahdal: SIGHUPvient du jour où les lignes commutées étaient courantes. Ce signal a été envoyé pour indiquer que la ligne a raccroché. Plus tard, lorsque cela était moins courant, il SIGHUPétait parfois utilisé par les démons pour relire le fichier de configuration sans redémarrer le processus. Dans ces temps modernes SIGHUPest rarement utilisé. De nombreux démons auront leur propre façon de réinitialiser (c.-à apachectl graceful-d rndc reconfig. , Ou . Pour les choses qui ne le sont pas, vous devriez utiliser des [init.d|smf|upstart|launchd]contrôles si possible.
bahamat
13

Vous devriez commencer par la plus douce et dégénérer à partir de là. Cela signifie, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Bien que la plupart des gens sautent SIGINT et SIGQUIT.

Ignacio Vazquez-Abrams
la source
De plus, certaines applications (comme le JDK) gèrent SIGQUIT différemment. Je n'utiliserais probablement pas SIGQUIT sans savoir comment l'application spécifique le gère.
dimo414