"tuer PID" ne tue pas vraiment le processus, pourquoi?

99

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 2200 où 2200 est mon PID et le processus n'est pas tué. Après quelques minutes, l'attente est toujours dans les top et ps aux . J'ai même essayé de le taper avec sudo - pas de résultats.

Des idées pourquoi ce serait comme ça?

EDIT

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

[email protected]:/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
[email protected]:/etc/grub.d$ fg
top

[email protected]:/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
[email protected]:/etc/grub.d$ fg
top

[email protected]:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps
    
posée Patryk 03.09.2011 - 09:47
la source

5 réponses

147

Les processus peuvent ignorer certains signaux. Si vous envoyez SIGKILL, il ne sera pas capable de l'ignorer (et de ne pas l'attraper pour faire des nettoyages). Essayez:

kill -9 {PID}

En savoir plus en lisant la page de manuel:

man kill
    
réponse donnée Michał Šrajer 03.09.2011 - 10:09
la source
30

Si kill est appelé sans paramètre, il envoie le signal numéro 15 ( SIGTERM ). Ce signal peut être ignoré par le processus. Ce signal avertit le processus de nettoyer ses objets et de se terminer correctement par lui-même. C'est le bon moyen.

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 et non le processus lui-même. C'est la mauvaise voie.

On dit que kill -9 <pid> fonctionne toujours. C'est une incrédulité . Il existe des situations où même kill -9 ne tue pas le processus. Par exemple, lorsqu'un processus a l'état D (veille sans interruption). Un processus entre dans cet état chaque fois qu'il attend des E / S (généralement pas très longues). Ainsi, si un processus attend des E / S (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 tuer le processus . Peut importe ce que vous faites. Vous pouvez simplement essayer de rendre le fichier accessible que le processus continue.

    
réponse donnée chaos 10.06.2014 - 08:22
la source
7

Bien que le nom kill ne tue pas 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 au processus de se terminer. Il est tout à fait possible d'écrire un programme qui joue un air joyeux lorsque vous lui envoyez le signal SIGTERM , mais pas recommandé.

Un autre signal courant est SIGHUP 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 effectuant kill -9 [pid] .

    
réponse donnée danne 06.09.2011 - 13:51
la source
2

Il semble que vous soyez en train de suspendre 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é. Si vous lancez "fg", le processus est dégelé, il peut donc capter le signal et se terminer automatiquement. Cela pourrait expliquer pourquoi «fg» apparaît pour mettre à jour la liste des processus.

    
réponse donnée user24497 06.09.2011 - 17:00
la source
0

Depuis C ++, j'ai exécuté:

kill(4024, SIGKILL);

Et sur un terminal Linux (Ubuntu),

$ ps -ax | grep my_su

La sortie était la suivante:

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

Apparemment, il (4024) survit encore. Cependant, dès que j'ai terminé le processus parent qui a appelé la déclaration "kill" ci-dessus, 4024 ne s'est plus présenté. Maintenant je juge que le processus "défunt" n'est rien d'autre qu'une ligne affichée et a décidé de l'ignorer. J'espère que mon expérience pourrait aider quelqu'un. Cheers!

    
réponse donnée Park JongBum 11.03.2016 - 00:51
la source

Lire d'autres questions sur les étiquettes