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, patientez toujours dans top
et 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ù 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
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
Si kill
est appelé sans paramètre, il envoie le signal numéro 15 (SIGTERM
name__). 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 méthode de Nice.
Vous pouvez également "envoyer" le signal numéro 9 (SIGKILL
name__) 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 manière.
On dit que kill -9 <pid>
fonctionne toujours. C'est un 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 ininterruptible). 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 des entrées/sorties (sur un disque dur défectueux par exemple) et qu’il n’est pas programmé correctement (avec un délai d’attente), vous devez simplement ne peut 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.
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 au processus de se terminer. 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é.
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 signal SIGKILL en faisant kill -9 [pid]
.
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 permet de capter le signal et de se terminer automatiquement. Cela pourrait expliquer pourquoi "fg" apparaît pour mettre à jour la liste de processus.
À 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 terminé le 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é!
Vous pouvez également utiliser kill -l
pour 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.
C’est ce que j’utilisais jadis pour installer localhost sur le port 80 (Par angular cli). Obtenir des informations sur l’application en cours d’exécution sur le port 80.
Sudo lsof -i tcp:80
After That
Sudo kill -9 3348
où 3348
est le pid du processus en cours d'exécution