“Tuer <PID>” ne tue pas vraiment le processus, pourquoi?


118

J'essaie d'améliorer mes compétences en ligne de commande et j'ai rencontré un problème où je ne peux pas tuer un processus. Je tape kill 2200où 2200 est mon PID et le processus n'est pas tué. Après quelques minutes, l'attente est toujours dans le topet ps aux. J'ai même essayé de le taper avec sudo - aucun résultat.

Des idées pourquoi ce serait comme ça?


MODIFIER

J'ai trouvé une dépendance étrange, où fgmet à jour la liste des processus:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps

Quel processus était-ce? Avez-vous vérifié si le processus était peut-être terminé ? Dans ce cas, vous devez tuer le processus parent.
Htorque

Le processus est top(comme indiqué dans la modification). Je voulais juste essayer de mettre le programme en arrière-plan, puis de le ramener.
Patryk

2
Si vous suspendez un processus avec CTRL-z, il bloquera la plupart des signaux tant qu'il est suspendu (c'est-à-dire jusqu'à ce que vous fassiez un fgou bgpour le processus)
nos

Réponses:


179

Les processus peuvent ignorer certains signaux. Si vous envoyez SIGKILL, il ne pourra pas l’ignorer (ni l’attraper pour le nettoyer). Essayer:

kill -9 {PID}

En savoir plus en lisant la page de manuel:

man kill

22
Notez également que dans certaines circonstances très spécifiques , un processus peut être dans un état de zombie / défunt que même SIGKILL ne peut pas tuer le processus. Dans ce cas, vous devrez trouver le processus parent et le supprimer.
Lie Ryan

15
Si ce processus ne fonctionne pas correctement, alors KILL DASH NINE !
scottl

4
Et parfois, il n'y a pas de processus parent, auquel cas vous êtes simplement foutu. Le seul moyen de supprimer un tel processus consiste à redémarrer la machine.
user606723

2
Le nom de la commande kill continue d’être trompeur pour de nombreux utilisateurs (y compris moi au début). On suppose que lorsque vous dites "tuer X", cela signifie vraiment tuer le X et ne pas faire autre chose. Je comprends que cela ne changera rien, mais je souhaiterais qu'ils aient choisi un nom plus élaboré ...
rbaleksandar

1
Qu'est-ce que même après kill -9ne fonctionne pas et le processus est toujours en suspens?
Douglas Gaskell

42

Si killest appelé sans paramètre, il envoie le numéro de signal 15 ( SIGTERM). Ce signal peut être ignoré par le processus. Ce signal indique au processus de nettoyer ses affaires et de se terminer correctement par lui-même. C'est la bonne façon.

Vous pouvez également "envoyer" le numéro de signal 9 ( SIGKILL) qui ne peut pas être ignoré par le processus. Le processus ne le reconnaîtra même pas, car le noyau termine le processus, pas le processus lui-même. C'est la mauvaise façon.

On dit kill -9 <pid>toujours travaille. C'est une incrédulité . Il y a des situations où même kill -9ne tue pas le processus. Par exemple, lorsqu'un processus a l'état D(veille ininterrompue). Un processus entre dans cet état chaque fois qu'il attend une entrée / sortie (normalement pas très long). Ainsi, si un processus attend une entrée / sortie (sur un disque dur défectueux par exemple) et qu'il n'est pas programmé correctement (avec un délai d'attente), vous ne pouvez tout simplement pas arrêter le processus . Peut importe ce que vous faites. Vous pouvez simplement essayer de rendre le fichier accessible pour que le processus continue.


2
Ceci est très utile, je l'ai expérimenté plusieurs fois à cause d'un accès I / O bloqué sur des disques réseau et je me demandais pourquoi je ne pouvais pas tuer les processus bloqués. Existe-t-il plus de documentation sur ce problème spécifique et sur la manière de le contourner?
Sheljohn

7

Bien que son nom, kill ne tue pas réellement les processus, il lui envoie des signaux. De la page de manuel:

kill - send a signal to a process

Le signal par défaut envoyé par kill [pid]est SIGTERM, qui demande généralement mais pas nécessairement la fin du processus. Il est tout à fait possible d'écrire un programme qui joue une mélodie joyeuse lorsque vous lui envoyez le signal SIGTERM , mais cela n'est pas recommandé.

SIGHUP est un autre signal commun qui est souvent utilisé pour demander à un programme de relire ses fichiers de configuration.

Si vous voulez vraiment tuer un programme, vous devez utiliser le signal SIGKILL en le faisant kill -9 [pid].


2

Il semble que vous suspendez un processus (peut-être en appuyant sur Ctrl-Z dans le terminal). Dans cet état, votre processus ne répondra pas à un SIGTERM car il est gelé. Exécuter 'fg' libère le processus, ce qui lui permet de capter le signal et de se terminer automatiquement. Cela pourrait expliquer pourquoi «fg» apparaît pour mettre à jour la liste de processus.


1
Alors, comment trouver le terminal attaché?
RuX

0

À partir de C ++, j'ai exécuté:

kill(4024, SIGKILL);

Et sur un terminal Linux (Ubuntu),

$ ps -ax | grep my_su

La sortie était:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Apparemment, il (4024) survit encore. Cependant, dès que j'ai mis fin au processus parent qui appelait l'instruction "kill" ci-dessus, 4024 n'apparaissait plus. Maintenant, je juge que le processus "défunt" n’est plus qu’une ligne affichée et décide de l’ignorer. J'espère que mon expérience pourra aider quelqu'un là-bas. À votre santé!


0

Vous pouvez également utiliser kill -lpour afficher les signaux pris en charge par votre architecture et en savoir plus sur le signal que vous souhaitez utiliser pour envoyer correctement un signal.

Remarque: comme d'autres l'ont peut-être mentionné, l'utilisation de kill -9 {PID}n'est pas recommandée à moins que ce ne soit un processus zombie. une fois qu'un processus reçoit un SIGKILL va s'arrêter immédiatement sans nettoyage ou toute autre procédure appropriée.


0

C’est ce que j’utilisais jadis pour utiliser localhost sur le port 80 (Par clular angulaire) Obtenir les informations de l’application en cours sur le port 80

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

3348est le pid du processus en cours

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.