Recherche de site Web

Principes fondamentaux de la gestion des processus sous Linux


Objectif

Apprendre les bases de la gestion des processus sous Linux

Système d’exploitation et versions logicielles

  • Système d’exploitation : – Toutes les distributions Linux

Exigences

  • Certains programmes mentionnés dans ce tutoriel nécessitent un accès root

Difficulté

FACILE

Conventions

  • # – nécessite que les commandes Linux données soient exécutées avec les privilèges root, soit
    directement en tant qu’utilisateur root, soit en utilisant la commande sudo
  • $ – nécessite que des commandes Linux données soient exécutées en tant qu’utilisateur régulier non privilégié

Introduction

L’une des activités principales d’un administrateur système est celle de surveiller et d’interagir avec les processus exécutés sur une machine. Dans ce tutoriel, vous serez initié à l’utilisation de certains outils fondamentaux qui vous aideront à accomplir cette tâche vitale.

La commande ps

Ps est l’un des programmes fondamentaux utilisés dans la surveillance des processus : il vous donne essentiellement un instantané des processus en cours d’exécution sur une machine au moment où vous appelez la commande. Voyons-le en action : nous allons d’abord essayer de l’exécuter sans aucune option :

ps

  PID TTY          TIME CMD
24424 pts/0    00:00:00 bash
24468 pts/0    00:00:00 ps

Comme vous pouvez le voir sur la sortie ci-dessus, seuls deux processus sont représentés : bash avec un PID (ID de processus) 24424 et ps lui-même avec le pid 24468. En effet, lorsqu’elle est appelée sans aucune option, la commande ps affiche les processus associés à l’UID de l’utilisateur qui a lancé la commande et du terminal à partir duquel elle est appelée.

Comment surmonter cette limitation ? En utilisant l’option -a, nous pouvons faire ps pour nous montrer tous les processus, à l’exception des leaders de session et des processus non associés à un terminal.

Un animateur de session est un processus qui a un PID identique à celui du SID (Session Id) de la session dont il est (le premier) membre. Lorsqu’un processus est créé, il fait partie de la même session que son processus parent : puisque par convention l’identifiant de session est le même que le PID de son premier membre, nous appelons ce processus un leader de session. Essayons d’exécuter ps avec l’option -a et de vérifier sa sortie :

ps -a

  PID TTY          TIME CMD
12466 tty1     00:00:00 gnome-session-b
12480 tty1     00:00:17 gnome-shell
12879 tty1     00:00:00 Xwayland
12954 tty1     00:00:00 gsd-sound
12955 tty1     00:00:00 gsd-wacom
12957 tty1     00:00:00 gsd-xsettings
12961 tty1     00:00:00 gsd-a11y-keyboa
12962 tty1     00:00:00 gsd-a11y-settin
12965 tty1     00:00:00 gsd-clipboard
12966 tty1     00:00:03 gsd-color
12967 tty1     00:00:00 gsd-datetime
12970 tty1     00:00:00 gsd-housekeepin
12971 tty1     00:00:00 gsd-keyboard
12972 tty1     00:00:00 gsd-media-keys
12973 tty1     00:00:00 gsd-mouse
12976 tty1     00:00:00 gsd-orientation

[...]

La sortie du programme a été tronquée, mais vous pouvez facilement voir qu’il inclut maintenant des processus qui appartiennent à différents terminaux et utilisateurs. La sortie nous montre des informations sur PID dans la première colonne, TTY dans la seconde, TIME qui est le temps cumulé que le processeur a passé sur le processus, et CMD qui est la commande qui a démarré le processus.

Pour avoir une sortie encore plus riche, nous pouvons ajouter les options -u et -x : la première indique à ps de faire une sélection par l’identifiant de l’utilisateur, tandis que la seconde indique au programme d’inclure également des processus non associés à un terminal, tels que les démons :

ps -aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2 223932  8708 ?        Ss   Jul20   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 25
root         2  0.0  0.0      0     0 ?        S    Jul20   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   Jul20   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S<   Jul20   0:00 [mm_percpu_wq]
root         7  0.0  0.0      0     0 ?        S    Jul20   0:00 [ksoftirqd/0]
root         8  0.0  0.0      0     0 ?        S    Jul20   0:07 [rcu_sched]
root         9  0.0  0.0      0     0 ?        S    Jul20   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    Jul20   0:04 [rcuos/0]
root        11  0.0  0.0      0     0 ?        S    Jul20   0:00 [rcuob/0]
root        12  0.0  0.0      0     0 ?        S    Jul20   0:00 [migration/0]
root        13  0.0  0.0      0     0 ?        S    Jul20   0:00 [watchdog/0]
root        14  0.0  0.0      0     0 ?        S    Jul20   0:00 [cpuhp/0]
root        15  0.0  0.0      0     0 ?        S    Jul20   0:00 [cpuhp/1]
root        16  0.0  0.0      0     0 ?        S    Jul20   0:00 [watchdog/1]
root        17  0.0  0.0      0     0 ?        S    Jul20   0:00 [migration/1]
root        18  0.0  0.0      0     0 ?        S    Jul20   0:00 [ksoftirqd/1]
root        20  0.0  0.0      0     0 ?        S<   Jul20   0:00 [kworker/1:0H]
root        21  0.0  0.0      0     0 ?        S    Jul20   0:02 [rcuos/1]
root        22  0.0  0.0      0     0 ?        S    Jul20   0:00 [rcuob/1]
root        23  0.0  0.0      0     0 ?        S    Jul20   0:00 [cpuhp/2]
root        24  0.0  0.0      0     0 ?        S    Jul20   0:00 [watchdog/2]
root        25  0.0  0.0      0     0 ?        S    Jul20   0:00 [migration/2]
root        26  0.0  0.0      0     0 ?        S    Jul20   0:00 [ksoftirqd/2]
root        28  0.0  0.0      0     0 ?        S<   Jul20   0:00 [kworker/2:0H]

[...]
egdoc    13128  0.0  0.1  74736  5388 ?        Ss   Jul20   0:00 /usr/lib/systemd/systemd --user
egdoc    13133  0.0  0.0 106184   420 ?        S    Jul20   0:00 (sd-pam)
egdoc    13143  0.0  0.1 218328  3612 ?        Sl   Jul20   0:00 /usr/bin/gnome-keyring-daemon --daemonize --login

[...]

Vous pouvez voir que beaucoup de nouvelles informations ont été ajoutées. La première nouvelle colonne de la sortie est %CPU : elle indique l’utilisation du processeur du processus, exprimée en pourcentage. Un pourcentage est également utilisé pour la colonne suivante, %MEM, qui indique la mémoire physique de la machine utilisée par le processus. VSZ est la taille de la mémoire virtuelle du processus exprimée en Kio.

La colonne STAT utilise un code pour exprimer l’état du processus. Nous n’allons pas décrire tous les états possibles ici, mais simplement expliquer ceux qui apparaissent dans la sortie ci-dessus (vous pouvez avoir une vue d’ensemble complète en consultant la page de manuel ps).

Examinons le premier processus de la sortie : il a le PID 1, c’est donc le premier processus lancé par le noyau. C’est logique, on peut voir qu’il s’agit de systemd, le système d’initialisation Linux relativement nouveau, maintenant adopté par presque toutes les distributions. Tout d’abord, nous avons un S qui indique que le processus est en état de veille interruptible, ce qui signifie qu’il est inactif et qu’il se réveillera dès qu’il recevra une entrée. Le s, au contraire, nous dit que le processus est un chef de session.

Un autre symbole, qui n’apparaît pas dans le premier brut, mais dans certaines des descriptions des autres processus, est < qui indique que le processus a une priorité élevée, et donc une faible valeur de politesse (nous verrons ce qu’est une valeur de politesse dans la section correspondante de ce tutoriel). Un l dans la colonne STAT indique que le processus est multithread et un signe + qu’il se trouve dans le groupe de processus de premier plan.

Enfin, dans la dernière colonne, nous avons la colonne START, indiquant l’heure à laquelle la commande a commencé.

Une autre option intéressante que nous pouvons passer à la commande ps, est -o, qui est la version courte de --format. Cette option vous permet de modifier la sortie à l’aide d’espaces réservés, en spécifiant les colonnes à afficher. Par exemple, la course à pied :

ps -ax -o %U%p%n%c

On nous donnera d’abord la colonne USER ( %U), suivie du PID du processus ( %p), de la colonne NI ( %n), qui indique le niveau de politesse, et enfin de la colonne COMMAND ( %c) :

USER       PID  NI COMMAND
root         1   0 systemd
root         2   0 kthreadd
root         4 -20 kworker/0:0H
root         6 -20 mm_percpu_wq
root         7   0 ksoftirqd/0
root         8   0 rcu_sched
root         9   0 rcu_bh
root        10   0 rcuos/0
root        11   0 rcuob/0
root        12   - migration/0
root        13   - watchdog/0
root        14   0 cpuhp/0
root        15   0 cpuhp/1
root        16   - watchdog/1
root        17   - migration/1
root        18   0 ksoftirqd/1
root        20 -20 kworker/1:0H
root        21   0 rcuos/1
root        22   0 rcuob/1
root        23   0 cpuhp/2
root        24   - watchdog/2
root        25   - migration/2
root        26   0 ksoftirqd/2

Utilisation de 'top' pour interagir dynamiquement avec les processus

Alors que ps nous donne un instantané statique des processus et de leurs informations au moment où vous l’exécutez, top nous donne une vue dynamique des processus, mise à jour à un intervalle de temps spécifié que nous pouvons spécifier à la fois lors du lancement du programme et de manière interactive (la valeur par défaut est de 3 secondes).

Top ne se contente pas de nous montrer une représentation dynamique des processus en cours d’exécution : nous pouvons interagir avec eux et avec le programme lui-même, en utilisant quelques touches. Par exemple, appuyer sur B nous permet de basculer l’utilisation des caractères gras, d nous permet d’entrer une valeur pour modifier le temps de retard, k nous permet d’envoyer un signal à un processus en l’invitant à saisir son PID et le code du signal, SIGTERM étant la valeur par défaut.

Changez la priorité des processus avec nice and renice

Comme nous l’avons vu précédemment, chaque processus a une priorité qui lui est attribuée, ce qui indique combien de temps le processus doit attendre que d’autres processus libèrent des ressources avant de pouvoir y accéder. Cette priorité peut être spécifiée avec une valeur qui se trouve dans une plage allant de -20 à 19. Moins la valeur est élevée, plus la priorité du processus est élevée. Cela peut sembler contre-intuitif au début, mais voyez-le de cette façon : plus le processus est agréable pour les autres processus, plus ils le surpasseront dans l’accès aux ressources.

Mais comment fixer la priorité d’un processus ? Nous pouvons utiliser le bon programme pour accomplir la tâche. Supposons que vous vouliez exécuter un script avec la valeur de priorité la plus basse possible : vous le préfaceriez de cette façon :

nice -n 19 ./script.sh

Vous pouvez également modifier la priorité d’un programme qui est déjà en cours d’exécution en utilisant renice en connaissant son PID :

renice -n 15 PID

Où PID est l’ID de processus du programme. N’oubliez pas que la commande renice doit être exécutée avec les autorisations root.

Envoyer des signaux aux processus avec les commandes kill et killall

Nous pouvons utiliser la commande kill pour envoyer un signal à un processus qui nous appartient, ou à chaque processus si nous avons les permissions root. Les différents signaux que l’on peut envoyer sont identifiés par un numéro : on peut facilement voir ces correspondances en exécutant la commande kill avec l’option -l :

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
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

Si aucune option n’est passée à la commande kill, par défaut, elle enverra un signal SIGTERM au processus spécifié, auquel ce dernier pourrait réagir de différentes manières : il peut s’arrêter immédiatement, essayer de faire un peu de nettoyage avant de s’arrêter, ou simplement ignorer le signal.

Pour spécifier le signal à envoyer à l’aide de kill, nous exécutons la commande suivie d’un tiret et du numéro du signal à envoyer. Par exemple, pour exécuter un signal SIGKILL, nous devons exécuter :

kill -9 PID

Le signal SIGKILL, contrairement à SIGTERM, ne peut pas être capté par le processus, qui ne peut pas réagir : il sera simplement arrêté immédiatement.

Un autre signal que vous verrez souvent est SIGINT qui est le signal envoyé lors de l’interruption du clavier (CTRL-c). Il essaie également de mettre fin au processus de manière élégante et peut être ignoré par le processus. SIGSTOP et SIGCONT vont respectivement suspendre et reprendre l’exécution d’un processus : le premier, comme SIGKILL, ne peut pas être intercepté ou ignoré. Pour une liste complète et une description des signaux, vous pouvez consulter le manuel pour signal(7) en fonctionnement :

man 7 signal

Le programme killall a le même but de kill, et comme kill, envoie un signal SIGTERM quand aucun autre n’est spécifié, (cette fois avec l’option --signal), mais au lieu de référencer un processus par son PID, il le fera par le nom de la commande, tuant effectivement tous les processus fonctionnant sous le même.

Articles connexes: