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

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

Je pense qu'il y a probablement un terrain d'entente raisonnable, alors:

  1. Quand et pourquoi devrait kill -9 être utilisé? Quand et pourquoi pas?
  2. Qu'est-ce qui devrait être essayé avant de le faire?
  3. Quel genre de debugging d'un process "suspendu" pourrait causer d'autres problèmes?

Généralement, vous devez utiliser kill -15 avant de kill -9 pour donner au process cible une chance de nettoyer après lui-même. (Les process ne peuvent pas intercepter ou ignorer SIGKILL , mais ils peuvent et attrapent souvent SIGTERM ). Si vous ne donnez pas au process la possibilité de finir ce qu'il fait et nettoyez, il peut laisser des files corrompus (ou un autre état) qu'il ne sera pas en mesure de comprendre une fois redémarré.

strace / truss , ltrace et gdb sont généralement de bonnes idées pour voir pourquoi un process bloqué est bloqué. ( truss -u sur Solaris est particulièrement utile, je trouve que ltrace présente trop souvent des arguments aux appels de bibliothèque dans un format inutilisable). Solaris a également des outils utiles /proc , dont certains ont été portés sur Linux. ( pstack est souvent utile).

Randal Schwartz avait l'habitude de postr fréquemment "l'utilisation Inutile de (x)" sur des lists. L'un de ces articles concernait 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 process une chance proprement:

1) fermer les connections de la prise

2) nettoyer les files 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.

En général, 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 ce n'est pas le cas, RETIREZ LE BINAIRE car le programme est mal comporté!

N'utilisez pas kill -9. Ne pas faire sortir la moissonneuse-batteuse juste pour ranger le pot de fleur.

Juste une autre utilisation inutile d'Usenet,

(.Signature)

Il devrait toujours être OK pour faire kill -9 , tout comme il devrait toujours être OK pour arrêter en tirant sur le câble d'alimentation. Il peut être antisocial, et laisser un peu de récupération à faire, mais il devrait fonctionner, et est un outil élecsortingque pour les impatients.

Je dis ceci comme quelqu'un qui essaiera d'abord de tuer simplement (15), parce que cela donne à un programme la possibilité de faire un peu de nettoyage – peut-être en écrivant simplement à un journal «sortant sur sig 15». Mais je n'accepterai aucune plainte au sujet de la mauvaise conduite sur un kill -9.

La raison: beaucoup de clients le font à des choses que les programmeurs préfèrent alors ne le font pas. Le test de kill -9 random est un scénario de test bon et équitable, et si votre système ne le gère pas, votre système est cassé.

J'utilise kill -9 de la même manière que je jette des ustensiles de cuisine dans le lave-vaisselle: si un instrument de cuisine est ruiné par le lave-vaisselle alors je ne le veux pas.

Il en va de même pour la plupart des programmes (même les bases de données): si je ne peux pas les tuer sans que les choses se fassent, je ne veux pas vraiment les utiliser. (Et si vous utilisez une de ces bases de données qui ne vous encourage pas à faire semblant d'avoir des données persistantes alors qu'elles ne l'ont pas fait, je pense qu'il est time de commencer à penser à ce que vous faites).

Parce que dans le monde réel les choses peuvent descendre à tout moment pour une raison quelconque.

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

C'est la même chose pour les logiciels de bureau. Lorsque je veux arrêter mon browser, il faut généralement arrêter AGES. Il n'y a rien que mon browser doit faire qui devrait prendre plus de deux secondes au maximum. Quand je lui request de fermer, il devrait réussir à le faire immédiatement. Quand ce n'est pas le cas, eh bien, nous sortons tuer -9 et le faisons.

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

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

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

Donc, avant d'essayer de kill -9 un process <defunct> , exécutez ps -ef pour voir ce que son parent est et essayez le -15 (TERM) ou -2 (INT) et enfin -9 (KILL) sur son parent.

Note: ce que ps -ef fait .

Modification ultérieure et mise en garde: Procédez avec prudence lorsque vous tuez les process, leurs parents ou leurs enfants, car ils risquent de laisser des files ouverts ou corrompus, des connections inachevées, corrompre des bases de données, etc. un dernier recours, et si vous devez exécuter kill, utilisez les signaux spécifiés ci-dessus avant d'utiliser -9 (KILL)

Ne jamais jamais faire un kill -9 1 . Evitez également de tuer certains process comme mount`. Quand je dois tuer beaucoup de process (par exemple, une session X est bloquée et que je dois tuer tous les process d'un certain user), j'inverse l'ordre des process. 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 kill ne stoppe pas un process et libère ses ressources. Tout ce qu'il fait est d'envoyer un signal SIGKILL au process; vous pourriez vous refind avec un process qui est suspendu.

Il n'est pas facile de tuer les process: datatables peuvent être perdues, les applications mal conçues peuvent se briser de manière subtile et ne peuvent être réparées sans une réinstallation. Mais cela dépend entièrement de savoir ce qui est dangereux et ce qui ne l'est pas situation donnée. et ce qui serait à risque. L'user doit avoir une idée de ce que le process est ou devrait faire et quelles sont ses contraintes (disque IOPS, rss / swap) et être capable d'estimer combien de time un process long doit prendre (disons une copy de file, réenencoding mp3, migration de messagerie, sauvegarde, [votre time préféré ici].)

En outre, envoyer SIGKILL à un pid n'est pas une garantie de le tuer. S'il est coincé dans un syscall ou déjà zombi ( Z en ps ), il peut continuer à être zombi. C'est souvent le cas de ^ Z un long process en cours et l'oubli de bg avant d'essayer de kill -9 . Une fg simple reconnectera stdin / stdout et débloquera probablement le process, généralement suivie par la fin du process. S'il est coincé ailleurs ou dans une autre forme de blocage du kernel, seul un redémarrage peut être en mesure de supprimer le process. (Les process Zombie sont déjà morts après le traitement de SIGKILL par le kernel (il n'y a plus de code userland exécuté), il y a généralement une raison de kernel (similaire à «bloqué» en attente sur un syscall pour finir).

En outre, si vous voulez tuer un process et tous ses enfants, prenez l'habitude d'appeler kill avec le PID négatif, pas seulement le PID lui-même . Il n'y a aucune garantie de SIGHUP , SIGPIPE ou SIGINT ou d'autres signaux de nettoyage après, et avoir un tas de process désavoués à nettoyer (souvenez-vous mongrel?) Est ennuyeux.

Bonus evil: kill -9 -1 est un peu plus dommageable que kill -9 1 (Ne le faites pas en tant que root, sauf si vous voulez voir ce qui se passe sur une MV jetable, non importante)

Pourquoi tu ne veux pas kill -9 un process normalement

Selon l' 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 «attraper» pour effectuer un quelconque comportement d'arrêt.

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

Vous devez vous assurer qu'avant d'envoyer le signal au process que vous:

  1. Assurez-vous que le process n'est pas occupé (c.-à-d. Qu'il fait du «travail»); l'envoi d'un kill -9 au process entraînera essentiellement la perte de ces données.
  2. Si le process est une database non-répondante, assurez-vous qu'il a vidé ses caches d'abord. Certaines bases de données prennent en charge l'envoi d'autres signaux au process pour forcer le vidage de son cache.

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 là-bas. Pour résumer, je reorderais juste SIGTERM et SIGKILL , ou même SIGTERM , SIGINT et SIGKILL . Cependant, je donne plus d'options dans la réponse complète.

S'il vous plaît, n'hésitez pas à le download (clone) depuis le référentiel github à killgracefully 1