La commande kill
permet d’envoyer un signal à un processus. L’option -l
permet de lister tous les signaux possible :
# kill -l |
Tuer des processus
Lister les processus pour récuper leurs PID afin de les tuer 🔪
# ps aux | grep firefox |
Tuer un processus
# kill 3512 |
Équivalence
Pour tuer un processus proprement, on utilise la commande kill
qui équivaut au signal 15 SIGTERM
# kill <PID> |
En cas de processus récalcitrant, il est possible d’utiliser le signal 9 SIGTERM, ce dernier ne se souciera pas de des processus enfants existants et pourra engendrer des processus zombies (qui pourront toujours par la suite être tués) :
# kill -9 <PID> |
Raccourcis clavier
Les processus peuvent être suspendus avec des commande clavier :
- suspendre :
Ctrl+z
- supprimer :
Ctrl+c
- vider :
Ctrl+\
Tuer des processus en arrière plan
La commande kill
permet de tuer un processus en arrière-plan.
Affichage des tâches en arrière-plam avec jobs
:
# jobs |
Tuer le job n° 1 avec %
:
# kill -SIGTERM %1 |
Il ne reste plus que le n° 2 :
# jobs |
Tuer massivement des processus
Pour lister en fonction de critères spécifiques et tuer des processus en masse, on utilise les commandes pgrep
et pkill
.
Lister tous les processus d’un utilisateur :
# pgrep -l -u john |
Tuer tous les processus d’un utilisateur :
# pkill -SIGKILL -u bob |
Tuer massivement de façon plus fine
Pour une frappe plus chirurgicale, on peut déterminer sur quelle session les processus sont problématiques avec la commande w
(Show who is logged on and what they are doing).
# w -u john |
Tuer les processus de la session, si cela ne fonctionne pas, on peut specifier le signal 9 SIGKILL :
# pkill -t tty5 |
Arboressence des processus
La commande ptree
permet d’afficher un arbre des processus et déterminer leurs relations parents/enfants :
# pstree -p john |
Pour tuer les processus ENFANTS on utilise l’option -P
(pour PID du PARENT) de pkill
:
# pkill -P 1337 |
Avec un SIGKILL si nécessaire :
# pkill -SIGKILL -P 1337 |
Et les ENFANTS du processus disparaitront.
Tuer les tous avec killall
La commande killall
permet de tuer tous les processus en fonction de leurs noms
# killall <process> |
Exemple :
# killall php-cgi |
/!\ Résumé des commandes
Commandes :
# ps aux | grep <pattern> // lister les processus |
Notes
Les aplications sans ``tty`` sont des daemons |
Cas pratique
Suppression de processus
Création d’un script contenant une boucle while
:
[aline@SERVER01 ~]$ mkdir /home/aline/bin |
Lancement de 3 ‘occurence.sh’ en arrière plan (&
) du script en passant des arguments :
[aline@SERVER01 bin]$ occurence.sh Blue & |
Vérification que les 3 processus lancés écrivent bien dans /home/aline/occurence.sh_output.txt
:
[aline@SERVER01 ~]$ tail -f ~/occurence.sh_output.txt |
Lister les tâches existantes :
[aline@SERVER01 bin]$ jobs |
Arrêt du processus occurence.sh Blue et vérification (%1
indique le processus en arrière plan 1) :
[aline@SERVER01 bin]$ kill -SIGSTOP %1 |
Vérifification que le mot Blue n’est plus ajouté au fichier ~/occurence.sh_output.txt
:
[aline@SERVER01 ~]$ tail -f ~/occurence.sh_output.txt |
Terminer le processus occurence.sh Purple (-SIGTERM %2
) et vérification :
[aline@SERVER01 bin]$ kill -SIGTERM %2 |
Redémarrage (-SIGCONT %1
) du processus occurence.sh Blue et vérification :
[aline@SERVER01 bin]$ kill -SIGCONT %1 |
Arrêt de tous les processus et vérification :
[aline@SERVER01 bin]$ kill -SIGTERM %1 |
Lister tous les processus en cours d’exécution :
[aline@SERVER01 bin]$ ps -ef | grep tail |
Arrêt du processus tail :
[aline@SERVER01 bin]$ pkill -SIGTERM tail |
Contrôle de l’activité des processus
Création d’un script contenant une boucle while
:
[aline@SERVER01 ~]$ touch /home/aline/bin/BoucleSleep.sh |
Vérification de la charge avec top
:
[aline@SERVER01 ~]$ top |
Affichage du nombre de processeurs :
[aline@SERVER01 ~]$ lscpu |
Exécution du script :
[aline@SERVER01 ~]$ BoucleSleep.sh & |
Commande top
et les touches l
(charge), t
(threads) et m
(mémoire) pour changer d’affichage :
[aline@SERVER01 ~]$ top |
Exécution dans un autre terminal d’un deuxième ‘occurence.sh’ du script en arrière-plan :
[aline@SERVER01 ~]$ BoucleSleep.sh & |
Commande top
:
[aline@SERVER01 ~]$ top |
Exécution dans un autre terminal d’un troisième ‘occurence.sh’ du script en arrière-plan :
[aline@SERVER01 ~]$ BoucleSleep.sh & |
Commande top
:
[aline@SERVER01 ~]$ top |
Pousser la charge en lançant 3 autres ‘occurence.sh’ du script en arrière-plan :
[aline@SERVER01 ~]$ BoucleSleep.sh & |
Commande top
:
top - 12:42:32 up 11 days, 1:28, 3 users, load average: 1.23, 2.50, 1.54 |
Arrêt des processus ‘occurence.sh’ avec la touche k
+PID directement dans l’interface top
:
[...] |
Vérification : ????
6498 aline 20 0 222448 2996 2748 R 22.9 0.2 5:31.47 BoucleSleep.sh |
Documentation
https://n0tes.fr/2015/09/03/Sigterm-VS-Sigkill/
https://n0tes.fr/2015/10/18/Les-processus-zombies/
https://n0tes.fr/2015/10/18/Les-processus-sous-linux/
https://n0tes.fr/2016/05/25/Superviser-les-processus/
https://www.cyberciti.biz/faq/unix-linux-killall-command-examples-usage-syntax/
MAN w(1) : https://man7.org/linux/man-pages/man1/w.1.html
MAN kill(1)
MAN killall(1)
MAN pgrep(1)
MAN pkill(1)
MAN pstree(1)
MAN signal(7)
MAN ULIMIT https://ss64.com/bash/ulimit.html