Tuer des processus

La commande kill permet d’envoyer un signal à un processus. L’option -l permet de lister tous les signaux possible :

# kill -l

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT
7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT
19) SIGSTOP 20) SIGTSTP [...]

Tuer des processus

Lister les processus pour récuper leurs PID afin de les tuer 🔪

# ps aux | grep firefox
3598 0.0 0.1 9337 1880 pts/1 S 12:45 0:00 /bin/bash /home/jon/bin/ firefox
3597 0.0 0.1 9337 1512 pts/1 S 12:45 0:00 /bin/bash /home/jon/bin/ firefox-auto
3512 0.0 0.1 9337 1532 pts/1 S 12:45 0:00 /bin/bash /home/jon/bin/ firefox-yutube
3532 0.0 0.0 9954 1264 pts/1 S+ 12:54 0:00 grep --color=auto 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>
# kill -15 <PID>
# kill -SIGTERM <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>
# kill -SIGKILL <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
[1]- Running sleep 666 &
[2]+ Running sleep 1337 &

Tuer le job n° 1 avec % :

# kill -SIGTERM %1

Il ne reste plus que le n° 2 :

# jobs
[2]+ Running sleep 1337 &

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
1337 bash
1338 sleep
1339 sleep
1340 sleep
1341 sleep

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
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
john tty2 13:37 8:12 0.01s 0.01s -bash
john tty4 13:37 8:12 0.14s 0.14s -bash
john tty5 13:37 8:12 0.42s 0.42s -sleep

Tuer les processus de la session, si cela ne fonctionne pas, on peut specifier le signal 9 SIGKILL :

# pkill -t tty5
# pkill -SIGKILL -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
bash(1337)─┬─sleep(1338)
├─sleep(1339)
├─sleep(1340)
└─sleep(1341)

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>
# killall -u <user> <process>

Exemple :

# killall php-cgi
# killall -u john php-cgi

/!\ Résumé des commandes

Commandes :

# ps aux | grep <pattern> // lister les processus

# kill -l // lister les signaux de kill
# kill <PID> // tuer un processus

# pgrep // lister les processus en fonction de critères
# pgrep -l -u john // lister tous les processus de l'utilisateur john
# pstree -p john // lister tous les processus parents/enfants

# pkill // tuer des processus en masse
# pkill -P <PID_parent> // tuer UNIQUEMENT LES ENFANTS
# pkill -9 -P <PID_parent> // tuer UNIQUEMENT LES ENFANTS brutalement
# pkill -9 -u john // tuer tous les processus de john

# w -u john // QUI fait QUOI et OÙ
# pkill -t tty5 // Tuer tous les processus d'une session
# pkill -SIGKILL -t tty5 // Idem mais de façon brutale

# jobs // affiche les processus en arrìere-plan
# kill -SIGTERM %<JOB_NUM> // tuer les processus en arrière-plan

# <command> & // lance une commande en background
# bg <command> // lance une commande en background
# fg <command> // lance une commande en foreground

# ulimit // limit the use of system-wide resources

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
[aline@SERVER01 ~]$ chmod +x /home/aline/bin/occurence.sh
[aline@SERVER01 ~]$ vim /home/aline/bin/occurence.sh
#!/bin/bash
while true; do
echo -n "$@ " >> ~/occurence.sh_output.txt
sleep 5
done

Lancement de 3 ‘occurence.sh’ en arrière plan (&) du script en passant des arguments :

[aline@SERVER01 bin]$ occurence.sh Blue &
[1] 3460

[aline@SERVER01 bin]$ occurence.sh Purple &
[2] 3482

[aline@SERVER01 bin]$ occurence.sh Pink &
[3] 3516

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
Blue Purple Blue Pink Purple Blue Pink Purple Blue Pink Purple Blue Purple Blue [...]

Lister les tâches existantes :

[aline@SERVER01 bin]$ jobs
[1] Running occurence.sh Blue &
[2]- Running occurence.sh Purple &
[3]+ Running occurence.sh Pink &

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
[1]+ Stopped occurence.sh Blue

[aline@SERVER01 bin]$ jobs
[1]+ Stopped occurence.sh Blue
[2] Running occurence.sh Purple &
[3]- Running occurence.sh Pink &

Vérifification que le mot Blue n’est plus ajouté au fichier ~/occurence.sh_output.txt :

[aline@SERVER01 ~]$ tail -f ~/occurence.sh_output.txt
[...]
Purple Pink Purple Pink Purple Pink Purple Purple Pink Purple Pink Purple Pink Purple

Terminer le processus occurence.sh Purple (-SIGTERM %2) et vérification :

[aline@SERVER01 bin]$ kill -SIGTERM %2

[aline@SERVER01 bin]$ jobs
[1]+ Stopped occurence.sh Blue
[2] Terminated occurence.sh Purple
[3]- Running occurence.sh Pink &

[aline@SERVER01 ~]$ tail -f ~/occurence.sh_output.txt
[...]
Pink Pink Pink Pink Pink Pink Pink Pink

Redémarrage (-SIGCONT %1) du processus occurence.sh Blue et vérification :

[aline@SERVER01 bin]$ kill -SIGCONT %1

[aline@SERVER01 bin]$ jobs
[1]+ Running occurence.sh Blue &
[2] Terminated occurence.sh Purple
[3]- Running occurence.sh Pink &

[aline@SERVER01 ~]$ tail -f ~/occurence.sh_output.txt
[...]
Blue Pink Blue Pink Blue Pink Blue Pink Blue Pink

Arrêt de tous les processus et vérification :

[aline@SERVER01 bin]$ kill -SIGTERM %1
[aline@SERVER01 bin]$ kill -SIGTERM %3

[aline@SERVER01 bin]$ jobs
[1]+ Terminated occurence.sh Blue &
[2] Terminated occurence.sh Purple
[3]+ Terminated occurence.sh Pink &

[aline@SERVER01 ~]$ tail -f ~/occurence.sh_output.txt
[...]
Blue Pink Blue Pink Blue Pink Terminated

Lister tous les processus en cours d’exécution :

[aline@SERVER01 bin]$ ps -ef | grep tail
aline 4581 31358 0 10:02 pts/0 00:00:00 tail -f occurence.sh_output.txt
aline 4869 2252 0 10:33 pts/1 00:00:00 grep --color=auto tail

Arrêt du processus tail :

[aline@SERVER01 bin]$ pkill -SIGTERM tail
[aline@SERVER01 bin]$ ps -ef | grep tail
aline 4874 2252 0 10:36 pts/1 00:00:00 grep --color=auto 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
[aline@SERVER01 ~]$ chmod +x /home/aline/bin/BoucleSleep.sh
[aline@SERVER01 ~]$ vim /home/aline/bin/BoucleSleep.sh
#!/bin/bash
while true; do
var=1
while [[ var -lt 60000 ]]; do
var=$(($var+1))
done
sleep 1
done

Vérification de la charge avec top :

[aline@SERVER01 ~]$ top
top - 12:13:03 up 11 days, 58 min, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 113 total, 2 running, 111 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1829.4 total, 1377.3 free, 193.9 used, 258.2 buff/cache
MiB Swap: 1024.0 total, 1024.0 free, 0.0 used. 1476.1 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5861 root 20 0 0 0 0 I 0.3 0.0 0:00.71 kworker/1:3-events
6068 aline 20 0 273564 4300 3688 R 0.3 0.2 0:00.01 top
1 root 20 0 178680 13424 8924 S 0.0 0.7 0:04.03 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
[...]

Affichage du nombre de processeurs :

[aline@SERVER01 ~]$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2
[...]

Exécution du script :

[aline@SERVER01 ~]$ BoucleSleep.sh &
[1] 6071

Commande top et les touches l(charge), t(threads) et m(mémoire) pour changer d’affichage :

[aline@SERVER01 ~]$ top

top - 12:23:45 up 11 days, 1:09, 3 users, load average: 0.21, 0.14, 0.05
[...]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
071 aline 20 0 222448 2964 2716 S 18.7 0.2 0:27.35 BoucleSleep.sh
[...]

Exécution dans un autre terminal d’un deuxième ‘occurence.sh’ du script en arrière-plan :

[aline@SERVER01 ~]$ BoucleSleep.sh &
[2] 6498

Commande top :

[aline@SERVER01 ~]$ top
top - 12:27:39 up 11 days, 1:13, 3 users, load average: 0.36, 0.25, 0.11
[...]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6071 aline 20 0 222448 2964 2716 S 19.0 0.2 1:36.53 BoucleSleep.sh
6498 aline 20 0 222448 2996 2748 R 15.7 0.2 0:16.34 BoucleSleep.sh
[...]

Exécution dans un autre terminal d’un troisième ‘occurence.sh’ du script en arrière-plan :

[aline@SERVER01 ~]$ BoucleSleep.sh &
[3] 6881

Commande top :

[aline@SERVER01 ~]$ top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6881 aline 20 0 222448 3032 2784 S 18.6 0.2 0:11.48 BoucleSleep.sh
6498 aline 20 0 222448 2996 2748 S 15.6 0.2 0:47.86 BoucleSleep.sh
6071 aline 20 0 222448 2964 2716 S 18.1 0.2 2:07.86 BoucleSleep.sh

Pousser la charge en lançant 3 autres ‘occurence.sh’ du script en arrière-plan :

[aline@SERVER01 ~]$ BoucleSleep.sh &
[4] 10708
[aline@SERVER01 ~]$ BoucleSleep.sh &
[5] 11122
[aline@SERVER01 ~]$ BoucleSleep.sh &
[6] 11338

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 :

[...]
PID to signal/kill [default pid = 11338]

[...]
Send pid 11338 signal [15/sigterm]

Vérification : ????

6498 aline 20 0 222448 2996 2748 R 22.9 0.2 5:31.47 BoucleSleep.sh
6881 aline 20 0 222448 3032 2784 R 21.3 0.2 4:54.47 BoucleSleep.sh
11122 aline 20 0 222448 2984 2736 R 15.3 0.2 2:32.48 BoucleSleep.sh
6071 aline 20 0 222448 2964 2716 S 15.0 0.2 6:50.90 BoucleSleep.sh
10708 aline 20 0 222448 3032 2784 S 14.6 0.2 2:53.46 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

> Partager <