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 :
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.
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].