Question «Tuer » ne tue pas vraiment le processus, pourquoi?


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. J'écris kill 2200 où 2200 est mon PID et le processus n'est pas tué. Après quelques minutes, l'attente est toujours dans le 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?


MODIFIER

J'ai trouvé une dépendance étrange, où fg met à 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

100
2017-09-03 07:47


origine


Quel processus était-ce? Avez-vous vérifié si le processus était peut-être défunt? 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 au travail en arrière-plan et le ramener ensuite. - Patryk
Si vous suspendez un processus avec CTRL-z, il bloquera la plupart des signaux tant qu'il est suspendu (c.-à-d. fg ou bg pour le processus) - nos


Réponses:


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). Essayer:

kill -9 {PID}

En savoir plus en lisant la page de manuel:

man kill

149
2017-09-03 08:09



notez également que dans certains circonstances très spécifiques, un processus peut être dans un état zombie / défunt, même SIGKILL ne peut pas tuer le processus. Dans ce cas, vous devrez trouver le processus parent et supprimer le processus parent. - Lie Ryan
Si ce processus sort de la ligne alors il est Tuer Dash Neuf! - scottl
Et parfois, il n'y a pas de processus parent, auquel cas vous êtes juste foutu. Le seul moyen de supprimer un tel processus consiste à redémarrer l'ordinateur. - user606723
Vous pouvez aussi simplement utiliser pkill process, où process est le nom du processus au lieu de l'ID de processus. - RobinJ
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 j'aimerais qu'ils aient choisi un nom plus élaboré ... - rbaleksandar


Si kill est invoqué sans aucun 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 la belle façon.

Vous pouvez également "envoyer" le numéro de signal 9 (SIGKILL) qui ne peut ê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 façon.

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


31
2018-06-10 06:22



Ceci est très utile, je l'ai expérimenté plusieurs fois à cause de la suspension des accès d'E / S sur les disques réseau et je me demandais pourquoi je ne pouvais pas tuer les processus qui gelaient. Y a-t-il plus de documentation sur ce problème spécifique et comment le contourner? - Sheljohn


En dépit de son 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 habituellement mais pas nécessairement demande au processus de se terminer. Il est tout à fait possible d'écrire un programme qui joue un air heureux lorsque vous envoyez le SIGTERM signaler à elle, mais pas recommandé.

Un autre signal commun 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 SIGKILL signaler en faisant kill -9 [pid].


7
2017-09-06 11:51





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.


2
2017-09-06 15:00



Alors, comment trouver un terminal attaché? - ruX


Depuis 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 terminé le processus parent qui a appelé la déclaration "kill" ci-dessus, 4024 n'a plus paru. 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. À votre santé!


0
2018-03-10 23:51