Quand ne devrais-je pas tuer -9 un processus?

401

Je suis toujours très hésitant à courir kill -9, mais je vois d’autres administrateurs le faire presque systématiquement.

Je pense qu'il y a probablement un juste milieu raisonnable, donc:

  1. Quand et pourquoi devrait- kill -9on utiliser? Quand et pourquoi pas
  2. Que faut-il essayer avant de le faire?
  3. Quel type de débogage un processus "bloqué" pourrait causer d'autres problèmes?
Mikel
la source
7
Une bonne réponse SO SO .
jw013

Réponses:

362

Généralement, vous devriez utiliser kill(raccourci pour kill -s TERM, ou sur la plupart des systèmes kill -15) avant kill -9( kill -s KILL) pour donner au processus cible une chance de se nettoyer lui-même. (Les processus ne peuvent ni intercepter ni ignorer SIGKILL, mais ils le peuvent et le font souvent SIGTERM.) Si vous ne donnez pas au processus la possibilité de terminer et de nettoyer, il risque de laisser des fichiers corrompus (ou un autre état) autour de lui. ne sera pas capable de comprendre une fois redémarré.

strace/ truss, ltraceEt gdbsont généralement bonnes idées pour regarder pourquoi un processus bloqué est bloqué. ( truss -uSolaris est particulièrement utile; je trouve ltracetrop souvent que les arguments des appels de bibliothèque sont présentés dans un format inutilisable.) Solaris dispose également d’ /procoutils utiles , dont certains ont été portés sous Linux. ( pstackest souvent utile).

geekosaur
la source
67
La raison impérieuse est que si vous prenez l'habitude d'envoyer SIGKILL, alors, lorsque vous obtiendrez un programme qui, par exemple, corrompra une base de données importante pour vous ou votre entreprise, vous le regretterez vraiment. kill -9a son utilité, en tant que terminateur de dernier recours, l'accent étant mis sur le dernier recours; Les administrateurs qui l'utilisent avant le dernier recours a) ne comprennent pas trop bien être un administrateur et b) ne devraient pas être sur un système de production.
Arcege
9
@Mikel Autre chose à faire: parfois, il est préférable d'inciter une application à se nettoyer avec un signal tel que SIGQUIT ou SIGSEGV si elle ne répond pas à SIGINT / SIGTERM. Par exemple, une application 3D plein écran ou même Xorg. Avec SIGQUIT, il n’aura aucune chance de nettoyer quoi que ce soit, mais en le persuadant de penser qu’un défaut de segment se produit, il aura l’impression qu’il n’ya pas d’autre choix que de nettoyer et de sortir.
Penguin359
12
@Arcege Pensez-vous que l'utilisation d'une base de données qui corrompe les données si elle est tuée avec -9 est une base de données utile, après tout? iirc, mysql, bdb, pg, etc ... se comportent tous bien quand on tue avec -9.
dhruvbird
13
killall -9 java ftw
dmourati
23
@dhruvbird: ce n'est pas parce que vos DB sont fournies avec des gilets pare-balles que vous devriez les tirer si vous n'en avez pas besoin. Bien que vous ayez raison de dire que ce n'est pas aussi risqué que semble le prétendre Arcege, je pense que son point de vue est toujours valable: c'est risqué et devrait être un dernier recours.
iconoclaste le
228

Randal Schwartz publiait fréquemment "Utilisation inutile de (x)" sur les listes. Un de ces articles parlait de kill -9. Il comprend des raisons et une recette à suivre. Voici une version reconstruite (citée ci-dessous).

(Citation abomination)

Non non Non. N'utilisez pas kill -9.

Cela ne donne pas au processus une chance de proprement:

1) fermer les connexions de prise

2) nettoyer les fichiers temporaires

3) informer ses enfants qu'il s'en va

4) réinitialiser ses caractéristiques de terminal

et ainsi de suite et ainsi de suite.

Généralement, envoyez 15 et attendez une seconde ou deux, et si cela ne fonctionne pas, envoyez 2, et si cela ne fonctionne pas, envoyez 1. Si cela ne fonctionne pas, ENLEVEZ LE BINAIRE car le programme est mal conçu!

N'utilisez pas kill -9. Ne sortez pas la moissonneuse-batteuse simplement pour ranger le pot de fleurs.

Juste une autre utilisation inutile d'Usenet,

(.Signature)

Shawn J. Goff
la source
12
Le système d'exploitation ne fermera-t-il pas les descripteurs de fichiers ouverts (y compris les sockets) à la fin du processus?
Brian Gordon
3
Oui, il sera. Mais supposons que vous supprimiez un processus serveur avec des clients connectés, les clients ne remarqueront pas que le serveur est parti avant l'expiration du délai.
Björn Lindqvist
45
Ah oui, le vieil argument "s’il est imparfait de quelque manière que ce soit, vous êtes stupide de l’utiliser".
Timmmm
3
Ou stupide à utiliser si si le processus en question est la production de votre entreprise
Warren P
3
Si un processus est tué, le socket envoie RST à l'homologue, où, comme si le processus appelait la fermeture ou l'arrêt du socket, le socket envoyait FIN. Il n'y a pas de délai d'attente nécessaire. Une situation de délai d'attente ne se produira que si l'alimentation est coupée ou si le câble réseau est débranché.
ctrl-alt-delor
78

Cela devrait toujours être acceptable kill -9, tout comme il devrait toujours être acceptable de s’arrêter en tirant sur le câble d’alimentation. C’est peut-être antisocial et laisser une certaine reprise à faire, mais cela devrait fonctionner et est un outil puissant pour les impatients.

Je dis cela en tant que personne qui essaiera d'abord de tuer simplement (15), parce que cela donne à un programme une chance de nettoyer, peut-être simplement d'écrire dans un journal "sortant du signal 15". Mais je n'accepterai aucune plainte pour mauvaise conduite sur un kill -9.

La raison: beaucoup de clients font ce que les programmeurs préfèrent ne pas faire. Le test aléatoire de mise à mort -9 est un scénario de test correct et juste. Si votre système ne le gère pas, votre système est en panne.

bébé
la source
2
Comment testez-vous "random kill -9"? Lorsque vous obtenez kill -9, vous avez terminé et fini.
Karel Bílek le
18
@ Karel: Vous testez si votre système peut récupérer après, et nettoyez toutes les transactions endommagées qui étaient en cours de traitement au moment de SIGKILL.
Tadeusz A. Kadłubowski
7
Ce n'est pas correct de faire kill -9comme si ce n'était pas correct de débrancher la prise. Bien sûr, il existe des situations dans lesquelles vous n’avez pas le choix, mais cela devrait être une action de dernier recours. Bien sûr, tirer sur le câble d'alimentation kill -9ne devrait pas avoir d'effet indésirable, comme empêcher le redémarrage correct de l'application ou du système d'exploitation, mais de la merde se produit et l'utilisation des méthodes recommandées ( kill [-15]) ou l'arrêt régulier aideront à éviter le désordre qui pourrait se produire si vous interrompez régulièrement les programmes et les systèmes d'exploitation de cette façon. Dans tous les cas, il existe toujours un risque de perte de données, quelle que soit la robustesse du code.
jlliagre
7
Je suppose que ce que Michael voulait dire par «OK» est que votre programme devrait régler cette situation avec élégance et pouvoir effectuer une forme de nettoyage au redémarrage. Par exemple, nettoyer les fichiers PID, etc., plutôt que de simplement jeter ses jouets hors du landau et de refuser de commencer.
Gerryk
2
@gerryk Ils devraient en effet, mais le problème est que certaines personnes considéreront cette réponse comme un "permis de tuer -9" quels que soient la situation et l'environnement. C'est une attitude irresponsable.
Juin
39

J'utilise kill -9 de la même manière que je jette les ustensiles de cuisine au lave-vaisselle: si un ustensile de cuisine est endommagé par le lave-vaisselle, alors je ne le veux pas.

Il en va de même pour la plupart des programmes (même des bases de données): si je ne peux pas les tuer sans que les choses se détériorent, je ne veux pas vraiment les utiliser. (Et si vous utilisez une de ces non-bases de données qui vous encourage à prétendre avoir conservé des données quand elles ne l’ont pas fait: eh bien, il est temps que vous réfléchissiez à ce que vous faites).

Parce que dans le monde réel, les choses peuvent tomber à tout moment pour n'importe quelle raison.

Les gens devraient écrire des logiciels tolérants aux plantages. En particulier sur les serveurs. Vous devriez apprendre à concevoir un logiciel qui suppose que les choses vont se casser, se bloquer, etc.

Il en va de même pour les logiciels de bureau. Lorsque je veux fermer mon navigateur, il faut généralement AGES pour l'éteindre. Il n'y a rien mon navigateur doit faire cela devrait prendre plus au maximum quelques secondes. Quand je lui demande de fermer, il devrait pouvoir le faire immédiatement. Quand ce n'est pas le cas, alors nous retirons kill -9 et le fabriquons.

Borud
la source
4
Je conviens qu’un processus devrait être écrit pour être tolérant à un tel échec, mais je pense que cela reste une mauvaise pratique de le faire. Une base de données va récupérer, mais elle peut détecter l’abandon brutal, puis déclencher une vérification significative de la récupération au redémarrage. Et qu'en est-il des demandes traitées par un processus? Ils seront tous coupés instantanément, les clients pourraient avoir des bugs et échouer aussi?
Daniel James Bryars
3
Une base de données qui ne peut pas être tuée à tout moment n'est pas une base de données correctement fiable. Ceci est une exigence assez fondamentale si vous avez besoin de cohérence. En ce qui concerne les clients: s’ils se débrouillent pour corrompre et corrompre les données lorsque la connexion est interrompue, ils sont également mal conçus. La redondance et les stratégies de reprise automatique / tentative de reprise automatique permettent de remédier à la perte de service. Habituellement, la plupart des défaillances rapides du système sont préférables à la récupération.
borud
4
@borud Ce n'est peut-être pas un logiciel parfaitement écrit, mais ce sont des logiciels que les gens utilisent tout le temps. Quels administrateurs système ont le luxe de pouvoir toujours choisir un logiciel parfaitement écrit, permettant de toujours récupérer avec élégance des perturbations soudaines? Pas beaucoup. Personnellement, j'utilise des scripts d'arrêt et démarre / arrête les processus via cela. S'ils ne répondent pas au script d'arrêt (qui envoie une signalisation appropriée au processus), je tue -9.
Steve Sether
2
Il n’ya pas de différence entre la préparation de produits de base et la préparation de plats plus complexes en ce qui concerne les outils. La différence est le cuisinier. (Cependant, si vous passez autant de temps à cuisiner que moi, vous réalisez que la robustesse est une exigence minimale des ustensiles de cuisine et que la plupart des vendeurs de fournitures de cuisine aux consommateurs ne sauraient pas connaître le mauvais outil d'un excellent outil.)
borud
1
Vous encouragez donc les gens à faire preuve de négligence, car il est difficile de faire les choses correctement? De plus en plus de logiciels sont exécutés dans des environnements opérationnels éphémères. Si vous écrivez un logiciel qui devient difficile s'il n'est pas arrêté correctement, vous aurez du mal à convaincre les employeurs de vous engager en tant que développeur.
borud
10

Non mentionné dans toutes les autres réponses est un cas où kill -9ne fonctionne pas du tout, lorsqu'un processus est <defunct>et ne peut pas être tué:

Comment puis-je tuer un processus <defunct> dont le parent est init?

Qu'est-ce qui est défunt pour un processus et pourquoi il n'est pas tué?

Donc, avant de tenter kill -9un <defunct>processus, lancez-vous ps -efpour voir quel est son parent et essayez le -15(TERM) ou -2(INT) et enfin -9(KILL) sur son parent.

Note: qu'est ps -ef- ce que .

Modifier plus tard et la prudence: Faire preuve de prudence en tuant les processus, leurs parents ou leurs enfants, car ils peuvent laisser des fichiers ouverts ou corrompus, les connexions inachevées, peuvent bases de données corrompues etc sauf si vous savez ce que le kill -9fait pour un processus, utiliser seulement en dernier recours , et si vous devez exécuter kill, utilisez les signaux spécifiés ci-dessus avant d'utiliser-9 (KILL)

Eduard Florinescu
la source
6

Ne jamais faire un kill -9 1. Évitez également de tuer certains processus tels que mount`. Lorsque je dois tuer beaucoup de processus (par exemple, une session X doit être suspendue et je dois tuer tous les processus d'un utilisateur donné), j'inverse l'ordre des processus. Par exemple:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Gardez à l'esprit que cela killn'arrête pas un processus et libère ses ressources. Il ne fait qu’envoyer un signal SIGKILL au processus; vous pourriez vous retrouver avec un processus qui est bloqué.

HandyGandy
la source
1
Le vote négatif était quelqu'un d'autre. Mais quelles ressources ne sont pas libérées? Voulez-vous simplement dire que le processus ne peut pas effectuer son nettoyage normal? Qu'en est-il des verrous de fichiers, des sémaphores, etc.? Peux-tu élaborer?
Mikel
On dirait que la mémoire partagée SysV et les sémaphores devront être nettoyés, au moins. archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel
8
Cette réponse est source de confusion et d’erreur. kill -9 1est simplement ignoré sous la plupart des unices. Il n'y a aucun besoin d'éviter kill -9pour mount, mais aucun point dedans non plus. Je ne sais pas ce que vous entendez par «inverser l'ordre des processus». kill -9arrête (en tant que tuer) un processus sans lui donner une chance de se plaindre; toutefois, le meurtre ne se produira pas immédiatement si le processus se déroule dans un appel système non interruptible . Tuer un processus avec kill -9libère la plupart des ressources, mais pas toutes .
Gilles
5

Tuer des processus bon gré mal gré n'est pas une mince affaire: des données peuvent être perdues, des applications mal conçues peuvent se casser de manière subtile qui ne peuvent pas être réparées sans une réinstallation ... mais cela dépend complètement de savoir ce qui est protégé ou non. situation donnée. et ce qui serait à risque. L’utilisateur devrait avoir une idée du processus qu’il est ou devrait être en train de faire et de ses contraintes (disque IOPS, rss / swap) et pouvoir estimer le temps qu’un processus long devrait prendre (par exemple une copie de fichier, réencodage mp3, migration de messagerie, sauvegarde, [votre temps préféré ici].)

De plus, envoyer SIGKILLà un pid n'est pas une garantie de le tuer. S'il est bloqué dans un appel système ou déjà zombié ( Zdans ps), il peut continuer à l'être. C’est souvent le cas d’un processus de longue haleine et de l’oubli bgavant d’essayer kill -9. Un simple fgva reconnecter stdin / stdout et probablement débloquer le processus, généralement suivi de la fin du processus. S'il est bloqué ailleurs ou dans une autre forme de blocage du noyau, seul un redémarrage peut permettre de supprimer le processus. (Les processus Zombie sont déjà morts après avoir SIGKILLété traités par le noyau (aucun autre code utilisateur ne sera exécuté), il existe généralement une raison pour le noyau (similaire au fait d'être "bloquée" en attente d'un appel système) pour que le processus ne se termine pas.)

De même, si vous souhaitez supprimer un processus et tous ses enfants, prenez l'habitude d'appeler killavec le PID annulé, pas seulement le PID lui-même . Il n'y a aucune garantie SIGHUP, SIGPIPEni aucun SIGINTautre signal nettoyant après, et avoir un tas de processus de nettoyage désavoués pour nettoyer (vous souvenez-vous d'un bâtard?) Est ennuyeux.

Bonus maléfique: kill -9 -1est légèrement plus dommageable que kill -9 1(Ne faites pas non plus en tant que root, sauf si vous voulez voir ce qui se passe sur une VM jetable et non importante)

dhchdhd
la source
3

Pourquoi vous ne voulez pas kill -9un processus normalement

Selon man 7 signal:

Les signaux SIGKILL et SIGSTOP ne peuvent pas être interceptés, bloqués ou ignorés.

Cela signifie que l’application qui reçoit l’un ou l’autre de ces signaux ne peut pas les "intercepter" pour qu’elle ait un comportement de fermeture.

Ce que vous devez faire avant de lancer kill -9un processus

Avant d'envoyer le signal au processus, vous devez vous assurer que:

  1. Assurez-vous que le processus n'est pas occupé (c.-à-d. "Travail"); l'envoi d'un kill -9processus entraînera essentiellement la perte de ces données.
  2. Si le processus est une base de données non réactive, assurez-vous qu'elle a vidé en premier ses caches. Certaines bases de données prennent en charge l'envoi d'autres signaux au processus pour forcer le vidage de son cache.

la source
3

J'ai créé un script qui aide à automatiser ce problème.

Il est basé sur ma réponse complète 2 dans une question très similaire à stackoverflow .

Vous pouvez lire toutes les explications ici. Pour résumer, je recommanderais juste SIGTERMet SIGKILL, ou même SIGTERM, SIGINTet SIGKILL. Cependant, je donne plus d'options dans la réponse complète.

S'il vous plaît, n'hésitez pas à télécharger (cloner) à partir du référentiel github pour tuer gracieusement 1

Dr Beco
la source