64 votes

Comment est-il possible que kill -9 pour un processus sous Linux n'ait aucun effet?

Je suis en train d'écrire un plugin pour mettre en évidence les chaînes de texte automatiquement lorsque vous visitez un site web. C'est comme le soulignent les résultats de la recherche automatique et pour beaucoup de mots; il pourrait être utilisé pour les personnes souffrant d'allergies pour faire des mots vraiment se démarquer, par exemple, lorsqu'ils parcourent un aliment site.

Mais j'ai un problème. Quand j'ai essayer de combler un vide, frais FF fenêtre, c'est en quelque sorte bloque l'ensemble du processus. Quand j'ai tuer le processus, toutes les fenêtres disparaissent, mais le Firefox processus reste en vie (parent PID est 1, n'écoute pas tous les signaux, qui a beaucoup de ressources ouvertes, encore de la bouffe du CPU, mais ne bouge pas).

Donc deux questions:

  1. Comment est-il même possible pour un processus de ne pas écouter kill -9 (ni en tant qu'utilisateur, ni en tant que root)?

  2. Est-ce que je peux faire, mais un redémarrage?

[EDIT] C'est le processus fautif:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
digulla  16688  4.3  4.2 784476 345464 pts/14  D    Mar28  75:02 /opt/firefox-3.0/firefox-bin

Même avec ps -ef | grep firefox

UID        PID  PPID  C STIME TTY          TIME CMD
digulla  16688     1  4 Mar28 pts/14   01:15:02 /opt/firefox-3.0/firefox-bin

C'est le seul processus à gauche. Comme vous pouvez le voir, ce n'est pas un zombie, c'est de la course! Il n'est pas écouter kill -9, peu importe si j'ai tuer par PID ou nom de! Si j'essaie de me connecter avec strace, puis l' strace également se bloque et ne peut pas être tués. Il n'y a pas de sortie, soit. Ma conjecture est que FF se bloque dans certains routine du noyau, mais qui?

[EDIT2] sur la Base des commentaires par sigjuice:

ps axopid,comm,wchan

pouvez-vous montrer dans le noyau de routine d'un processus se bloque. Dans mon cas, le plugin délinquance a le Beagle Indexeur (openSUSE 11.1). Après la désactivation du plugin, FF a été rapide et le renard heureux de nouveau.

125voto

Dave Sherohman Points 25122

Comme indiqué dans les commentaires de l'OP, de l'état du processus (STAT) D indique que le processus est dans un "non interruptible sommeil" de l'état. Dans le monde réel, cela signifie généralement qu'il est en attente sur les I/O et ne peut pas/ne pas faire n'importe quoi - y compris la mort, jusqu'à ce que l'opération d'e/S est terminée.

Les processus en D de l'état ne sera normalement là pour une fraction de seconde avant que l'opération est terminée et ils reviennent R/S. Dans mon expérience, si un processus est coincé D, c'est le plus souvent en essayant de communiquer avec un inaccessible NFS ou autre système de fichiers distant, en essayant d'accéder à un disque dur défaillant, ou de faire usage d'un morceau de matériel par voie de pâte feuilletée pilote de périphérique. Dans de tels cas, la seule façon de récupérer et de permettre le processus de mourir, c'est soit obtenir le fs/lecteur/matériel de sauvegarder et de fonctionnement pour le I/O peut la compléter ou à donner et redémarrez le système. Dans le cas spécifique de la NFS, la monture peut aussi éventuellement le temps de retour de l'opération d'e/S (avec un code d'erreur), mais cela dépend des options de montage et il est très commun pour les montages NFS être mis à attendre indéfiniment.

Ceci est distinct d'un zombie processus, ce qui aura un statut d' Z.

8voto

John Feminella Points 116878

Double-vérifier que le parent-id est vraiment 1. Si non, et c'est - firefox, essayez d'abord d' sudo killall -9 firefox-bin. Après cela, essayez de tuer le processus spécifique Id individuellement sudo killall -9 [process-id].

Comment est-il même possible pour un processus de ne pas écouter kill -9 (neiter en tant qu'utilisateur, ni en tant que root)?

Si un processus est allé <defunct> et devient un zombie avec un parent de 1, vous ne pouvez pas le tuer manuellement; seulement init peut. Zombie processus sont déjà morts et disparus - ils ont perdu la capacité d'être tués, alors qu'ils ne sont plus des processus, seulement un processus d'entrée de la table et de son code de sortie, en attente d'être collectés. Vous devez tuer le parent, et vous ne pouvez pas tuer init pour des raisons évidentes.

Mais voir ici pour plus d'informations générales. Un redémarrage sera de tuer tout, naturellement.

1voto

Georg Schölly Points 63123

Est-il possible, que ce processus est redémarré (par exemple par init) juste au moment où vous le tuer?

Vous pouvez le vérifier facilement. Si le PID est de même après l' kill -9 PID alors que le processus n'a pas été tué, mais si il a changé le processus a été redémarré.

0voto

karim79 Points 178055
sudo killall -9 firefox

Devrait fonctionner

EDIT: [PID] a changé de firefox

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