Le fonctionnement des processus sous GNU/Linux


Voici un article qui vous explique comment fonctionnent et comment gérer les processus sous GNU/Linux.

On appelle processus, l'instance d'un programme à un instant T et son environnement, c'est à dire les ressources comme les fichiers ouverts, la mémoire utilisée, utilisation processeur etc.. qui permettent l'exécution de ce programme.

Sous GNU/Linux, les processus :
Enfin GNU/Linux est un système multi-tâche, c'est à dire que plusieurs processus peuvent être exécutés en même temps, en réalité, un seul utilise le processus à la fois. Le processeur sachant effectuer une seule instruction à la fois.

Le propriétaire et la hiérarchie des processus

La visualisation des processus à un instant T se fait avec la commande ps
Si vous désirez voir les processus en temps réel, utilisez la commande top qui permet aussi d'afficher l'utilisation processeur, mémoire etc..

Il existe bien entendu des outils graphiques pour visualiser les processus comme par exemple gnome-system-monitor

malekalmorte@TuxPortable:~$ ps -Af
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0         0 17:05 ?        00:00:01 init [2]
root         2     1         0 17:05 ?        00:00:00 [ksoftirqd/0]
root         3     1         0 17:05 ?        00:00:00 [events/0]
root         4     1         0 17:05 ?        00:00:00 [khelper]
root         5     1         0 17:05 ?        00:00:00 [kthread]

root         2     1         0 17:05 ?        00:00:00 [ksoftirqd/0]
root         3     1         0 17:05 ?        00:00:00 [events/0]
root         4     1         0 17:05 ?        00:00:00 [khelper]
root         5     1         0 17:05 ?        00:00:00 [kthread]
root         7     5         0 17:05 ?        00:00:08 [kacpid]
root        93     5        0 17:05 ?        00:00:00 [kblockd/0]
root       119     5       0 17:05 ?        00:00:00 [pdflush]

Dans cet exemple :
Nous pouvons constater qu'init a l'ID 1, il est le processus racine dans la hiérarchie des processus. C'est en fait, le processus qui est lancé par le noyau après son initialisation, init démarre ensuite les services (dit daemons). Dans l'exemple, on peut voir que c'est le cas du processus ksoftirqd (Softirq daemon) qui a bien le PPID 1. ksoftirqd est donc bien un processus enfant d'init.

L'état des processus

Comme nous l'avons vu un processus peut avoir un état : Actif, Exécutable, Endormi, Zombi.
L'état d'un processus peut être modifié par un autre processus, par lui même ou par l'utilisateur.

Interagir avec les processus

Il est tout à fait possible pour l'utilisateur d'interagir avec les processus. Pour cela, l'utilisateur utilise la commande kill
Kill permet d'envoyer un signal à un processus.
Il existe énormément de signaux. Pour visualiser la liste des signaux utilisez l'option -l
malekalmorte@TuxPortable:~$ 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     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

pour une description, utilisez : man signal
Vous pouvez utiliser soit le nom du signal soit son numéro lorsque vous envoyez un signal avec kill. Voici quelques descriptifs des principaux signaux utilisés :

Nom Signal N°du signal Comportement par défaut Description
SIGINT 2 Terminer le processus Arrêt par la combinaison de touches Ctrl-C ou mort du processus parent.
SIGKILL 9 Terminer le processus Envoie d'un signal d'arrêt, l'arrêt du programme est brutal, il ne se termine par comme il faut, à utiliser quand un programme ne répond pas.
SIGSEGV 11 Terminer le processus Signal envoyé lorsqu'un programme accède à un endroit invalide en mémoire.
SIGTERM 15 Terminer le processus Utilisé pour fermer un programme proprement. C'est le signal envoyé par kill si aucun signal n'est spécifié.
SIGCHLD 17 Ignorer ce signal  Préviens le Processus parent qu'un processus fils est arrêté ou terminé.
SIGCONT 18 Reprendre le processus Demande à un programme de reprendre son exécution.
SIGSTOP 19 Arrêter le processus Demande au processus de suspendre son exécution.

Lorsque l'on veut arrêter un processus, on utilise le signal SIGTERM mais dans le cas où le processus a un comportement étrange ou qu'il ne répond plus, on doit utiliser le signal SIGKILL.
Le programme va alors quitter d'une manière brutale.

Utilisation des jobs et de screen

Lorsque vous lancez une commande par la console, le programme monopolise la console et vous la libèrement seulement quand celui-ci est arreté. L'avantage est que l'on peut voir des écritures, et donc les erreurs, ce qui peut être utile en cas de plantages du programme.
Mais Il est tout à fait possible de démarrer le programme en "background" c'est à dire en arrière blanc sans que celui-ci monopolise la console. Pour cela, il faut ajouter le caractère & à la fin du programme ou appuyer sur les touches ALT+Z lors de l'exécution du programme.

En fait, cela envoie un SIGSTOP au programme, vous pouvez alors reprendre l'exécution du programme avec la commande : fg

Cela peut-être pratique dans le cas de l'édition d'un fichier de configuration, par exemple, on modifie les DNS :
malekalmorte@TuxPortable:~$ vim /etc/resolv.conf

[1]+  Stopped                 vim /etc/resolv.conf

En appuyant sur CTRL+Z on revient sur la console, on voit d'ailleur le programme vim "stopped"
on peut alors faire un test de ping
malekalmorte@TuxPortable:~$ ping www.google.fr
ping: unknown host www.google.fr


Dans le cas d'un échec, revenir sur le fichier de configuration avec la commande : fg
fg va reprendre alors le dernier job lancé. Cependant, vous pouvez spécifier le PID du job pour reprendre celui que vous désirez.
Enfin vous pouvez lister les jobs en cours avec la commande : jobs

Dans certains cas, par exemple une compilation, on désire que le programme continue son exécution en arrière plan, ou si l'on se connecte en ssh sur une machine, pouvoir reprendre la compilation où on en était, tout en aillant les messages sur la console.

Dans ce cas là, il faut utiliser screen. La commande screen permet d'émulter un terminal pour y exécuter des commandes.
On créé alors un terminal avec la commande : screen -a
Pour quitter le terminal virtuel, il faut alors utiliser la combinaison de touches CTRL puis en appuyant sur A et ensuite D
Enfin pour se reconnecter au terminal virtuel, on utilise la commande : screen -r
Screen se reconnecte au terminal s'il y en a qu'un. Si plusieurs terminaux ont été créés, vous devez alors spécifier le numéro du terminal que vous souhaitez rejoindre.

Retour à la page d'accueil