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 :
- un propriétaire : celui qui a lancé
le programme et qui poura interagir avec ce processus.
- un PID, c'est à dire un
numéro qui permet d'interagir avec celui-ci.
- une hiérarchie, un processus (que l'on appellera
processus
père) peut lancer un autre processus (que l'on appellera
processus enfant ou fils).
- un état : Actif,
Exécutable, Endormi, Zombi.
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 :
- La colonne UID (UserID) nous donne le
propriétaire du processus.
- La colonne PID (ProcessusID) nous donne le
numéro du processus par lequel il est identifié.
- La colonne PPID (Parent Processus ID ) nous donne le
numéro du processus parent auquel le processus enfant
appartient.
- La colonne TTY nous relève dans quel terminal le
processus tourne (dans l'exemple aucun).
- La colonne CMD nous donne le nom de l'executable qui a
lance le programme/processus.
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.
- Actif: le processus utilise le processeur et est donc en
train de
réaliser des actions pour lequel il a
été
conçu.
- Exécutable : le processus est en
exécution mais il
est en attente de libération du processus qui est
utilisé
par un processus actif. Pour l'utilisateur, ceci est invisible car
l'opération est très rapide.
- Endormi: comme son nom l'indique, le processus est endormi,
il ne
fait rien. Par exemple, un processus peut attendre un
événement pour redevenir Actif, comme par
exemple, que
l'on appuie sur une touche lors de l'affichage d'un message.
- Zombie: un processus zombi est un processus
terminé mais
le système ou le processus parent n'en a pas
été
informé.
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