Processus

Mise à jour : Debian 11.1 Bullseye

Les processus sont les instances d'exécution des commandes lancée par l'utilisateur, le système ou le noyau.

1 - Principe

1.1 - Création

Un processus est créé chaque fois qu'une commande est lancée. Ce processus est

Le premier processus, PID 1, est créé par init (systemd). Tous les autres processus lui sont rattachés directement ou par l'intermédiaire de leurs parents successifs.

1.2 - Fin

L'envoi d'un signal de terminaison par l'intermédiaire d'une commande kill permet de terminer un processus. Lorsque le processus se termine, son identifiant est supprimé et les processus fils restant sont rattachés au PID 1.

1.3 - État

Lorsque le processus a été créé, il peut-être dans l'un des états suivants :

R - running  = en cours d'exécution ou en attente de disponibilité processeur
S - sleeping = en attente d'un signal d'un autre processus pour poursuivre l'exécution T - stopped = en attente d'un signal externe pour redémarrer Z - zombie = le processus est "mort", mais son parent n'a pas récupéré l'information

2 - Liste et arborescence

2.1 - Liste

$ ps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:32 rcu_sched
8 ? 00:00:00 rcu_bh
9 ? 00:00:00 migration/0
10 ? 00:00:00 lru-add-drain
.....
$ ps -p 1,2,3
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /sbin/init
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
$ ps -C systemd,sh
PID TTY TIME CMD
1 ? 00:00:01 systemd
1108 ? 00:00:00 systemd
1113 ? 00:00:00 sh
$ ps -t 0
PID TTY TIME CMD
4689 pts/0 00:00:00 bash
4703 pts/0 00:00:13 xeyes
4704 pts/0 00:00:13 xeyes
4705 pts/0 00:00:13 xeyes
$ ps -t tty1
PID TTY TIME CMD
840 tty1 00:00:00 login
5265 tty1 00:00:00 bash

2.2 - Arborescence

$ pstree -lp
systemd(1)─┬─acpid(725)
├─agetty(804)
├─apache2(892)─┬─apache2(893)
│ ├─apache2(902)
│ ├─apache2(903)-lp N
│ ├─apache2(904)
│ ├─apache2(905)
│ ├─apache2(906)
│ └─apache2(2942)
├─atd(722)
├─atop(809)
..........
$ pstree -nlp
systemd(1)─┬─systemd-journal(319)
├─systemd-udevd(357)
├─systemd-timesyn(686)───{sd-resolve}(720)
├─rsyslogd(721)─┬─{in:imuxsock}(729)
│ ├─{in:imklog}(730)
│ └─{rs:main Q:Reg}(731)
├─sshd(722)
.......

3 - Caractéristiques

De nombreuses informations sont attachées à chaque processus et sont disponibles avec la commande ps.

3.1 - Liste des caractéristiques selon les options

PID : identifiant du processus
TTY : le cas échéant, le terminal ayant lancé la commande
TIME : temps de calcul cumulé
CMD ou COMMAND : nom de la commande ayant créé le processus
UID :  identifiant ou nom (selon disponibilité de la place) du propriétaire du processus (-f -fl)
USER : nom du propriétaire du processus (u)
STIME ou START : date de lancement
PPID :  identifiant du processus du parent
NI : gentillesse du processus (-l seulement)
%CPU : charge cpu : temps occupation CPU ramené au temps d'activité du processus
STAT ou S : état du processus

-o stat -o nice -o user -o pid -o ppid -o pcpu -o pmem -o cmd

3.2 - Exemples

$ ps -p 4273
PID TTY TIME CMD
4273 pts/1 00:00:00 bash
$ ps -p 4273 -f
UID PID PPID C STIME TTY TIME CMD
philippe 4273 4198 0 11:02 pts/1 00:00:00 bash
$ ps -p 6408 -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
0 S philippe 6408 6403 0 80 0 - 5691 - 14:21 pts/0 00:00:00 bash
$ ps -C firefox-esr u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
philippe 4773 0.8 3.7 2216340 302804 ? Sl 12:01 0:32 /usr/lib/firefox-esr/firefox-esr
$ ps -C firefox-esr uc
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
philippe 4773 0.8 3.7 2216340 302804 ? Sl 12:01 0:32 firefox-esr
$ ps  -o stat -o nice -o user -o pid -o ppid  -o pcpu -o pmem -o cmd -p 20919
STAT NI USER PID PPID %CPU %MEM CMD
S 0 root 20919 2 0.0 0.0 [kworker/2:1]

Pour simplifier la commande, utiliser un alias : psp (ps personnalisé)

$ alias psp="ps -o stat -o nice -o user -o pid -o ppid  -o pcpu -o pmem -o cmd"

$ psp c -p 20961
STAT NI USER PID PPID %CPU %MEM CMD
S<l -15 philippe 20961 6116 2.5 3.3 firefox-esr

$ psp -C firefox-esr
STAT NI USER PID PPID %CPU %MEM CMD
S<l -15 philippe 20961 6116 54.7 2.8 /usr/lib/firefox-esr/firefox-esr

4 - Recherche

$ pgrep firefo
2041

$ pgrep -l firefo
2041 firefox-esr

Dans l'exemple ci-dessus, la commande qui a permis le lancement était firefox, mais un script intermédiaire a lancé le programme firefox-esr. Au moment de la recherche, le script n'était plus en fonctionnement, il n'apparaît pas dans la liste des process.

$ pgrep -l -U www-data
5519 apache2
5522 apache2
5523 apache2
5524 apache2
5525 apache2
5526 apache2

5 - Terminaison des processus

5.1 - Commandes

$ kill 10028
$ pkill -e xey
xeyes killed (pid 7114)
xeyes killed (pid 7115)
xeyes killed (pid 7116)
[2]- Complété xeyes
[3]+ Complété xeyes
$ killall xeyes

5.2 - Terminaison, suspension

9        KILL            Terminaison brutale (risque de pertes de donnée)
15 TERM Terminaison propre utilisée par défaut par la commande kill
19       STOP            Suspension temporaire (non interceptable)
18 CONT Reprise d'activité après S1
2        INT             Terminaison propre équivalente à la combinaison de touches Ctrl C
20 TSTP Suspension temporaire équivalente à la combinaison de touches Ctlr Z

5.2.1 Envoi de signaux avec kill

$ kill -n 19 7122
ou
$ kill -s STOP 7122

5.2.2 Envoi de signaux avec pkill

$ pkill -18 xey
ou
$ pkill -CONT xey

5.2.3 Envoi de signaux avec killall

$ killall -s 19 xeyes
ou
$ killall s STOP xeyes

6 - Priorité d'exécution

La priorité d'exécution d'un processus est défini par la valeur de sa gentillesse (nice). Par défaut, la priorité est de 0 et peut être modifiée entre

6.1 - Affichage

Utiliser l'option -l de ps pour afficher la gentillesse des processus (colonne NI) :

$ ps -l -C xeyes
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
0 S philippe 3534 3498 0 80 0 - 11626 SyS_po 19:44 pts/0 00:00:05 xeyes

Ou bien utiliser l'option -o ni

$ ps -o ni -C xeyes
NI
0

6.2 - Lancer une commande avec une gentillesse donnée

Pour lancer une commande avec une gentillesse donnée, utiliser la commande nice.

$ nice -n 10 xeyes
# nice -n -10 xeyes

6.3 - Modifier la gentille d'un processus

Pour modifier la valeur d'une gentillesse, utiliser la commande renice.

$ nice -n 10 xeyes &
[1] 8578
$ renice -n 15 8578
8578 (process ID) priorité précédente 10, nouvelle priorité 15
# renice -n -15 8613 -u philippe
8613 (process ID) priorité précédente 10, nouvelle priorité -15
1000 (user ID) priorité précédente -15, nouvelle priorité -15