Vous êtes sur la page 1sur 12

Atelier Système 1 2019-2020

TP 3: Gestion de processus

Objectifs
L’objectif de ce TP est d’aborder les notions sur les processus. A la fin de ce TP l’étudiant
devrait :
- visualiser les processus de la machine
- basculer les processus d’une exécution en arrière plan et en premier plan
- dégager l’arborescence des processus
- déterminer l’état des différents processus

1. GESTION DES PROCESSUS


1.1 Les caractéristiques d'un processus
Plusieurs processus peuvent s’exécuter en parallèle. Le système doit être capable de les
identifier. Pour cela il attribue à chacun d'entre eux, un numéro appelé PID (Processus
Identification).
Un processus peut lui-même créer un autre processus, il devient donc un processus parent ou
père, et le nouveau processus, un processus enfant. Ce dernier est identifié par son PID, et le
processus père par son numéro de processus appelé PPID (Parent Processus Identification).
Tout processus a obligatoirement un père, à l'exception du processus init, le premier
processus du système et l'ancêtre de tous les processus. Le PID de init est 1.

1.2 États des processus


Un processus devient tour à tour actif/inactif tout au long de sa vie ; il passe donc par
différents états :
 Élu : le CPU exécute le code de ce processus.
 Prêt : il dispose de toutes les ressources nécessaires à son fonctionnement à
l’exception du CPU. Il est dans une file d’attente associée au CPU.
 Bloqué : il est en attente d’une ressource autre que le CPU ou d’un événement.
 Zombie : le processus a terminé son exécution et est prêt à mourir ; à ce stade,
l’ordonnanceur a détecté l’arrêt de la tâche mais le père du processus n’a pas encore
pris en compte sa mort ; il existe donc toujours une entrée pour le processus dans la
table des processus.

1
Atelier Système 1 2019-2020

1.3 Visualiser les processus


1.3.1 commande ps (process status)
La commande ps permet de visualiser les processus du système. Elle extrait toutes ses
informations du fichier /proc dans lequel le noyau place toutes les informations concernant
l’état du système en cours d’utilisation. En faisant un man ps, vous aurez l'éventail de tous les
paramètres possibles.
Par défaut, cette commande affiche uniquement les processus lancés par l’utilisateur à partir
du terminal.

Cette commande possède de nombreuses options. Les options les plus intéressantes sont :
-a : (all) affiche les processus de tous les utilisateurs
-x : affiche aussi les processus qui ne sont pas rattachés au terminal en cours
-u : (user) affiche le nom de l'utilisateur qui a lancé le processus et sa date de lancement. Cette
option peut prendre en argument une liste d'utilisateurs séparés par une virgule
-g : (group) même chose pour les groupes
-t : même chose pour les terminaux
-p : même chose pour les PID
-f : (full-format) affiche des informations techniques sur chaque processus
-l : (long format) affiche encore plus d'informations détaillées sur chaque processus
-H : (hierarchy) affiche les processus sous la forme d'une hiérarchie (parfois représentée par
des tabulations)
 La commande ps -ef affiche les informations suivantes:

2
Atelier Système 1 2019-2020

La signification des différentes colonnes est la suivante:

Certains processus sont permanents (PPID=1), c'est à dire qu'ils sont lancés au démarrage du
système et arrêtés uniquement à l'arrêt du système. On appelle ces processus des démons.
 La commande ps –Al permet une sortie assez riche.
 On peut utiliser la syntaxe avec l’option -o pour ne présenter que les champs désirés :

 Pour voir les processus d'un seul utilisateur, vous pouvez taper : ps -u root
La commande ps ax affiche une liste des processus système en cours d'exécution, y compris
les processus appartenant à d'autres utilisateurs. Pour afficher également le propriétaire de ces
processus, utilisez la commande ps aux. Cette liste est statique ; il s'agit d'une copie des
processus en cours d'exécution.
Pour obtenir une liste des processus en cours mise à jour constamment, utilisez la commande
top.
Vous pouvez utiliser la commande ps combinée à la commande grep pour savoir si une
commande est en cours d'exécution. Par exemple, pour déterminer si vi est encore en cours
d'utilisation, utilisez la commande : ps ax | grep vi

3
Atelier Système 1 2019-2020

Les principaux champs disponibles sont (le libellé de la colonne est entre parenthèses) :

Les états définis par le champ STAT contiennent 3 caractères.

4
Atelier Système 1 2019-2020

Les valeurs du premier signifient :

Le second caractère du champ STAT est positionné à W si le processus est déplacé en espace
de pagination. Enfin un N apparaît en troisième caractère si le processus présente une valeur
nice positive.
1.3.2 Commande pidof
Cette commande permet de retourner les PID d’un processus.

1.3.3 Commande pstree


La commande pstree permet d'afficher les processus sous forme d'arborescence : pratique
pour voir la hiérarchie entre les divers processus.

1.4 Arrêter un processus


Vous disposez de la commande kill pour arrêter un processus. Pour pouvoir arrêter un
processus, vous devez connaître son PID (commande ps), puis vous tapez : kill -9 PID
Un utilisateur ne peut arrêter que ses propres processus. Seul l'administrateur système a le
droit d'arrêter un processus ne lui appartenant pas.
1.4.1 Commande kill
La commande kill termine un ou plusieurs processus référencés par leurs PID.
Syntaxe : kill options PID
Options :
kill -l : Affiche la liste des signaux
kill -signal : Le signal (référencé par son nom ou par son numéro) est envoyé aux processus.
Le signal 9 tue systématiquement les processus
Exemple : Terminaison du processus 24721 : $ kill -9 24721

5
Atelier Système 1 2019-2020

Les principaux signaux sont:


• SIGHUP (SIGnal Hang UP) : fin du shell
• SIGINT (SIGnal INTerrupt) : interruption d'un processus
• SIGTERM (SIGnal TERminate) : terminaison (par défaut)

• SIGNSTOP (SIGnal STOP): suspendre un processus (non pas le tuer)


• SIGKILL (SIGnal KILL) : tueur de processus, ne peut être ignoré et force l'arrêt du
processus (-9)
1.5 Changer la priorité d'un processus
Les processus tournent avec un certain degré de priorité, un processus plus prioritaire aura
tendance à s'accaparer plus souvent les ressources du système pour arriver le plus vite
possible au terme de son exécution. C'est le rôle du système d'exploitation de gérer ces
priorités.
1.5.1 Commande nice
Vous disposez de la commande nice pour modifier la priorité d'un processus. La syntaxe est la
suivante : nice valeur commande
Plus le nombre est grand, plus la priorité est faible. Par exemple -2 est plus prioritaire que 0.
nice -5 xclock
nice –n -20 xclock
Si aucun argument n'est fourni, nice affiche la priorité d'ordonnancement en cours sinon, nice
exécute la commande désirée en ajustant la priorité d'ordonnancement.
Si aucun ajustement n'est précisé, la valeur de priorité de la commande est augmentée de 10.

1.5.2 Commande renice


La commande renice permet de changer la priorité d’un programme qui est déjà en exécution.

6
Atelier Système 1 2019-2020

1.6 Lancer un processus en tâche de fond (en arrière plan)


Pour lancer une commande quelconque, vous en entrez le nom après le prompt du Shell, tant
que la commande n'est pas terminée, vous n'avez plus la main au niveau du Shell, vous ne
disposez plus du prompt et vous êtes obligé de lancer un autre Shell, pour taper une autre
commande.
Vous disposez d'une technique simple qui permet de lancer une commande à partir d'un Shell,
et de reprendre aussitôt la main. Il vous suffit de rajouter un & à la fin de la commande. Celle-
ci se lancera en " tâche de fond ", et vous reviendrez directement au prompt du Shell.

1.6.1 Commande &


La première technique est très simple : elle consiste à rajouter le petit symbole & à la fin de la
commande que vous voulez envoyer en arrière-plan.
Exemple : xclock &
On vous renvoie deux informations.

 [1] : c'est le numéro du processus en arrière-plan dans cette console. Comme c'est le
premier processus que nous envoyons en arrière-plan, il prend le numéro 1.

 16504 : c'est le numéro d'identification général du processus (le fameux PID dont on a
déjà parlé). Cette information vous permet de tuer le processus avec kill si nécessaire.

Il reste toutefois un problème : le processus est « attaché » à votre console. Si vous fermez
la console sur laquelle vous êtes, le processus sera tué et ne s'exécutera donc pas jusqu'au
bout.

1.6.2 Commande nohup : détacher le processus de la console

7
Atelier Système 1 2019-2020

L'option &, bien qu'assez couramment utilisée, a ce défaut non négligeable : le processus reste
attaché à la console, ce qui veut dire que si la console est fermée ou que l'utilisateur se
déconnecte, le processus sera automatiquement arrêté.
Si on veut que le processus continue, il faut lancer la commande via nohup. Cela s'utilise
comme ceci : nohup commande
La sortie de la commande est par défaut redirigée vers un fichier nohup.out. Aucun message
ne risque donc d'apparaître dans la console. D'autre part, la commande est maintenant
immunisée contre la fermeture de la console. Elle continuera de fonctionner quoi qu'il arrive
(sauf si on lui envoie un kill, bien sûr).

1.6.3 Ctrl + Z : mettre en pause l'exécution du programme


Cette fois, on suppose que vous avez lancé une opération trop longue sans le petit
symbole & exemple : $ top.
Tapez maintenant Ctrl + Z pendant l'exécution du programme. Celui-ci va s'arrêter et vous
allez immédiatement reprendre la main sur l'invite de commandes.
[1]+ Stopped top
Vous noterez que nous avons plusieurs informations : le numéro du processus en arrière-plan
(ici [1]), son état (Stopped) et le nom de la commande qui a lancé ce processus.
Le processus est maintenant dans un état de pause. Il ne s'exécute pas mais reste en mémoire.
1.6.4 bg : passer le processus en arrière-plan (background)
Maintenant que le processus est en « pause » et qu'on a récupéré l'invite de commandes,
tapez : $ bg
C'est tout, pas besoin de paramètre.
Cela commande la reprise du processus, mais cette fois en arrière-plan. Il continuera à
s'exécuter à nouveau, mais en tâche de fond.
En résumé, si vous avez lancé une commande par erreur en avant-plan et que vous voulez
récupérer l'invite de commandes, il faudra faire dans l'ordre :
 Ctrl + Z : pour mettre en pause le programme et récupérer l'invite de commandes ;
 bg : pour que le processus continue à tourner mais en arrière-plan.

1.6.5 jobs : connaître les processus qui tournent en arrière-plan


Vous pouvez envoyer autant de processus en arrière-plan que vous voulez au sein d'une même
console :
 soit en les lançant directement en arrière-plan avec un & à la fin de la commande ;

8
Atelier Système 1 2019-2020

 soit en utilisant la technique du Ctrl + Z suivi de bg que vous venez d'apprendre.


Comment savoir maintenant quels sont les processus qui tournent en arrière-plan ? Vous
pourriez, certes, recourir à la commande ps, mais celle-ci vous donnera tous les processus.
C'est un peu trop.
Heureusement, il existe une commande qui liste uniquement les processus qui tournent en
fond au sein d'une même console , c’est la commande jobs.
Encore une fois, vous avez le numéro du processus qui tourne en fond (à ne pas confondre
avec le PID), son état et son nom.

1.6.6 fg : reprendre un processus au premier plan (foreground)


La commande fg renvoie un processus au premier plan. Si vous avez un seul processus listé
dans les jobs, c'est ce processus qui sera remis au premier plan.
Si vous avez plusieurs processus en arrière-plan, il faudra préciser lequel vous voulez
récupérer. Par exemple, voici comment reprendre par exemple un find étant le job n° 2 :
$ fg %2

Exercice 1 :

1. Dans un système Linux, quel est le processus qui n'a pas de père. Quel est son PID ?
2. À quoi servent les options -f et -L de la commande ps ?
3. Lancez la commande ps ax -f -L et décrivez les différentes colonnes affichées.
4. Utilisez la commande pstree pour afficher l'arbre des processus en cours avec leur PID.
5. Quelle option de pstree permet d'afficher les ancêtres d'un certain processus dont le PID est
donné en argument à la commande ?
6. Quelle option de pstree permet d'afficher l'arbre complet des processus en cours (i.e.,
permet d'afficher
toutes les occurrences de chaque processus) ?
7. Quel signal est lancé par défaut à la commande kill ?
8. Que font les signaux suivants : SIGQUIT, SIGKILL, SIGCHLD ?
9. Quel caractère permet de lancer une commande en arrière-plan ? Quelle commande permet
de lancer une commande en arrière-plan ?
10. Affichez la liste des processus actifs dans votre terminal courant en utilisant ps.
11. Quelles informations sont affichées par défaut lorsque vous lancez la commande top?

9
Atelier Système 1 2019-2020

12. Utilisez la commande top pour afficher la liste des processus en temps réel en ajoutant les
colonnes PID et UID dans l'affichage.
13. a) Lancez 3 fois la commande sleep en arrière-plan avec des arguments différents à
chaque fois.
b) Affichez la liste des travaux en cours. Que signifient les caractères + et - dans le
résultat obtenu ?
c) Lancez ensuite la commande sleep en avant-plan.
d) Reprenez la main dans votre terminal et affichez à nouveau la liste des travaux en
cours.
e) Relancez en arrière-plan la dernière commande sleep, que vous avez suspendue
auparavant.
f) Arrêtez l'exécution de la première commande sleep en utilisant son PID.
g) Arrêtez l'exécution de la deuxième commande sleep en utilisant son numéro de travail.
h) Arrêtez l'exécution des deux dernières commandes sleep en utilisant la combinaison de
touches Ctrl+c.
14. Lancez la commande xclock depuis un terminal en avant-plan. Attendez que la fenêtre de
l'application s'ouvre puis fermez le terminal d'où vous l'avez lancée. Que se passe-t-il ?
15. Lancez la commande xclock depuis un terminal en arrière-plan. Attendez que la fenêtre de
l'application s'ouvre puis fermez le terminal d'où vous l'avez lancée. Que se passe-t-il ?
16. À quoi sert la commande nohup ? Comment faire pour à la fois détacher un processus du
shell à partir duquel il est lancé et le lancer en arrière-plan ? Donnez un exemple.
17.Expliquer le schéma suivant

10
Atelier Système 1 2019-2020

Exercice 2 :

1. Lancer deux terminaux (tty1 et tty2)


2. Exécuter dans le tty1 la ligne de commande suivante :
etudiant@polytech$ (while true; do echo –n A >> /tmp/log; sleep 1; done)

Que remarquez-vous ? Analyser cette ligne de commande en expliquant chaque partie.


Essayer d’ouvrir le fichier /tmp/log pour vérifier son contenu

3. Dans le terminal tty2, utiliser la commande (tail -f) pour afficher en temps réel le
contenu du fichier /tmp/log
4. Dans le tty1, interrompre le processus en cours d’exécution en utilisant Ctrl+Z.
5. Quel est le numéro de travail associé au processus interrompu ?
6. Vérifier dans tty2 que le remplissage du fichier log est arrêté.
7. Dans le tty1, lancer à nouveau le processus arrêté mais en arrière plan.
8. Vérifier que le travail déjà arrêté est en cours d’exécution. Vérifier dans tty2, l’état de
fichier /tmp/log
9. Dans tty1 et lancer les deux commandes suivantes :

11
Atelier Système 1 2019-2020

etudiant@polytech$ (while true; do echo –n B >> /tmp/log; sleep 1; done) &

etudiant@polytech$ ^B ^C

Expliquer le rôle de ces deux commandes.

10. Dans tty2, vérifier que les trois processus sont en cours d’exécution et consulter le
fichier /tmp/log
11. Dans tty1, utiliser ensuite kill pour envoyer un SIGSTOP au numéro de travail du
premier processus exécuté pour le suspendre. Vérifier avec la commande jobs
12. Relancer le travail du premier processus à l’aide de kill et le signal SIGCONT.
13. Utiliser SIGTERM pour terminer les travaux [2] et [3]. Vérifier avec jobs qu’ils sont
terminés.
14. Vérifier si tous les processus ont été terminés, sinon terminer ceux qui restent.

12

Vous aimerez peut-être aussi