Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Linux
  3. Gestion des processus
Extrait - Linux Principes de base de l'utilisation du système (8e édition)
Extraits du livre
Linux Principes de base de l'utilisation du système (8e édition) Revenir à la page d'achat du livre

Gestion des processus

Introduction

Un processus est un programme ou une commande en cours d’exécution sur un système. Linux peut exécuter plusieurs processus en même temps et il est possible de lancer plusieurs occurrences d’un même programme simultanément.

Le terme "tâche" est équivalent au terme "processus". C’est pourquoi on qualifie Linux de système multitâche.

Un processus démon est un processus qui s’exécute en permanence sur le système ; son code boucle à l’infini afin d’attendre et d’être prêt lorsqu’un utilisateur sollicite le service auquel il est attaché. Les noms des démons finissent généralement par un d ; on trouvera par exemple les démons crond (planification de tâches), httpd (serveur web Apache) et cupsd (impression) sur un système Linux.

Arborescence de processus et PID

Tout processus est identifié par un numéro unique, le PID (Process IDentifier) ; le noyau utilise une table des processus pour la gestion des tâches.

Deux primitives du noyau Linux permettent de créer des processus : fork et exec (ces primitives programmables peuvent être invoquées dans un langage comme le C). La première permet à un processus de créer un clone de lui-même, la seconde servira à ce clone pour exécuter le code d’un autre programme à sa place. Il en résulte une affiliation entre processus ; on parle alors de processus fils et de processus pères.

Tout processus a donc obligatoirement un père, sauf le premier processus du système : init pour les distributions s’initialisant toujours suivant la méthode SysV, ou systemd sur la plupart des distributions récentes. L’un ou l’autre est donc l’ancêtre de tous les processus du système et son PID est 1.

Le PID affecté à un processus est donné par le noyau Linux au lancement du programme. Il n’existe pas de moyen de prédire ce numéro.

Visualisation des processus

1. ps

La commande ps permet de voir la liste des processus du système : elle donne une image simplifiée des structures du noyau qui gèrent les processus. Elle extrait toutes ses informations du pseudosystème de fichiers /proc dans lequel le noyau place toutes les informations concernant l’état du système en cours d’utilisation.

Par défaut, cette commande affiche uniquement les processus lancés par l’utilisateur à partir du terminal ; par exemple :

[nicolas]$ ps 
  PID TTY          TIME CMD 
 1200 pts0     00:00:00 bash 
 1239 pts0     00:00:00 ps 

Cette commande possède de nombreuses options. De plus, elle accepte des options Unix98 (avec -), BSD (sans -) et GNU (format long avec --). En voici un aperçu en français sous Ubuntu :

[nicolas]$ ps --aide 
 
Usage: 
 ps [options] 
 
 Essayez 'ps --aide <simple|liste|sortie|threads|divers|tous>' 
  ou 'ps --aide <s|l|o|h|d|t>' 
 pour plus d'aide. 
 
Pour plus de détails, consultez ps(1). 
[nicolas]$ ps --aide tous 
 
Usage: 
 ps [options] 
 
Options de base:
 -A, -e               tous les processus 
 -a                   tous avec un tty sauf les têtes de sessions 
  a                   tous avec un tty y compris les autres utilisateurs 
 -d                   tous sauf les têtes de sessions 
 -N, --deselect       inverse la sélection 
  r                   seuls les processus s'exécutant 
  T                   tous...

Signaux et commande kill

Les commandes kill et killall permettent d’envoyer des signaux à des processus. La commande kill attend un numéro de processus en argument, tandis que killall attend un nom de commande.

La commande killall doit être utilisée avec beaucoup de précautions car elle envoie le signal à tous les processus portant le nom passé en argument.

Ces deux commandes peuvent, de façon optionnelle, recevoir un numéro de signal en argument. Par défaut, elles envoient toutes deux le signal 15 (voir ci-après) aux processus passés en argument :

kill [-<signal>] <pid> ... 

Un utilisateur ordinaire ne peut envoyer de signal en employant ces commandes qu’à ses propres processus.

Il est possible d’obtenir la liste des signaux disponibles avec l’option -l de la commande kill :

[nicolas]$ 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)...

Gestionnaires de processus graphiques

Il existe évidemment une large gamme d’outils graphiques de gestion des processus.

Par exemple, le "Moniteur système GNOME" fonctionne aussi avec l’environnement de bureau KDE et il est lancé avec la commande gnome-system-monitor :

images/608RI02N.png

Manipulation des processus

1. Lancer un processus

En avant-plan

Les exemples donnés jusqu’à présent font état de programmes lancés en avant-plan, c’est-à-dire de processus qui ne rendent la main à l’utilisateur qu’une fois terminés.

L’exécution d’un tel programme est réalisée en saisissant simplement la commande correspondante sur la ligne de commande avec éventuellement ses options et arguments.

Par exemple :

[nicolas]$ sleep 10 
              (attente de 10 secondes) 
[nicolas]$ 

La commande sleep, utilisée en exemple, se contente d’attendre le nombre de secondes indiqué en argument ; il faut imaginer à la place une commande longue, comme une sauvegarde ou la compilation d’un programme, qui, exécutée de cette manière, serait pénalisante dans le travail de l’utilisateur.

En arrière-plan

Pour ne pas être obligé d’attendre la fin d’un programme avant de pouvoir en lancer un autre, il est possible d’exécuter une commande en arrière-plan ; de cette manière, l’invite du shell réapparaît immédiatement et l’utilisateur peut saisir d’autres commandes.

Pour lancer un processus en arrière-plan, il suffit d’ajouter le caractère & à la fin de la ligne de commande :

[nicolas]$ sleep 10 & 
[1] 2004 
[nicolas]$ 

La ligne située juste après la commande n’est affichée qu’à titre indicatif et n’interfère en rien avec les traitements que peut effectuer la commande. Le numéro entre crochets identifie le travail (numéro de "job") du processus dans le shell courant ; le second indique le numéro de PID que le noyau a affecté...

Exercice

Exercice

Lancez la commande top puis arrêtez-la en lui envoyant le signal SIGTERM.

Solution

La commande top affiche en priorité les processus actifs et donc, sauf si le système est actuellement très fortement sollicité, devrait montrer son propre processus dans les premières lignes.

images/608RI03N.png

Sans quitter la commande top, il faut taper sur la touche [k] du clavier, puis saisir le PID relevé précédemment, 43407 dans cet exemple. L’interface demande alors quel signal doit être envoyé au processus et il suffit ici de laisser la valeur par défaut pour le signal SIGTERM en validant avec la touche [Entrée]