TP5 – Processus
Pour faire les exercices, vous avez besoin de connaître le langage bash. Vous pouvez vous référer à l'annexe shell. Vous pouvez aussi trouver une liste d'astuces ici. Tous les exercices sont obligatoires, sauf les exercices notés « défi » ou « optionnel » qui sont optionnels. En particulier, les exercices notés « hors présentiel » sont supposés fait d'une séance sur la suivante.
- Savoir observer les processus s'exécutant sur une machine
- Manipuler un processus en cours d'exécution
- Savoir tuer un (ensemble de) processus
- Notions de concurrence
Observer un processus (∼15mn)
Sur MacOS, l'option -C n'existe pas, et il faut rechercher le processus à la main avec ps ax. Plutôt que de chercher à la main, vous pouvez bien sûr vous simplifier la vie en utilisant un pipe et la commande grep.
Autre alternative sur Linux : pgrep -l bash, équivalent à ps | grep bash mais omet le processus ps lui-même, et est donc plus correct.
Suspendre un processus (∼15mn)
Lancement en avant-plan
-
Tapez la commande emacs pour lancer, en avant-plan, le processus emacs
$ emacs
-
Pour quelle raison l'invite de commande (prompt) n'est plus
présente dans le terminal ? Tapez la commande ls dans
le terminal et observez le résultat.
L'exécution en avant-plan du processus emacs empêche l'exécution de tout autre processus lancé depuis ce terminal.
La commande ls ne donne donc aucun résultat puisqu'elle n'est pas exécutée ! -
Dans le terminal, tapez control+z pour stopper le processus en
avant-plan (sans le détruire) et ainsi pouvoir utiliser le
terminal.
$ emacs ls ^Z [1]+ Stoppé emacs $
-
Dans le terminal, vérifiez que vous pouvez exécuter la
commande ls. Dans la fenêtre emacs,
tapez quelques caractères pour vérifier son fonctionnement.
La commande ls est bien exécutée.La fenêtre emacs, par contre, ne répond pas (puisque le processus emacs est stoppé).$ ls exo_manipulation_processus.php exo_manipulation_processus.php~ exo_observation_processus.php TP5 TP5.php
-
Lancez la commande ps -l pour identifier le
processus qui s'exécute et connaître l'état des autre
processus lancés depuis ce terminal. Consultez la
documentation de la commande ps pour trouver
cette information (section « Codes d'état de processus », ou « Process state codes »).
Le processus associé à la commande ps -l est en cours d'exécution ou peut s'exécuter (R).$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 28837 20963 0 80 0 - 6343 - pts/4 00:00:00 bash 0 T 1000 32394 28837 5 80 0 - 127865 - pts/4 00:00:00 emacs 0 R 1000 32402 28837 0 80 0 - 9315 - pts/4 00:00:00 ps
Le processus emacs est en attente (T).
Les autres processus sont dormants (S) (en attente d'un d'événement). -
Tapez la commande fg pour relancer le
processus emacs en avant-plan. Pouvez-vous maintenant
écrire dans la fenêtre emacs ? Dans le terminal ?
La fenêtre emacs est maintenant utilisable. Mais le terminal est à nouveau bloqué.$ fg emacs
Le processus emacs est repassé en avant-plan et empêche le lancement de tout autre processus depuis le terminal.
Lancement en arrière-plan
-
Si ce n'est pas déjà fait, tapez la commande emacs pour lancer, en avant-plan, le processus emacs
$ emacs
-
Dans le terminal, tapez control+z afin de suspendre le processus emacs. Vérifiez avec ps que le processus emacs est bien suspendu.
L'état du processus emacs (T) montre que celui-ci est bien suspendu.^Z [1]+ Stoppé emacs $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 T 1000 1127 28837 28 80 0 - 127855 - pts/4 00:00:00 emacs 0 R 1000 1143 28837 0 80 0 - 9315 - pts/4 00:00:00 ps 0 S 1000 28837 20963 0 80 0 - 6343 - pts/4 00:00:00 bash
-
Tapez la commande bg pour relancer le
processus emacs en arrière-plan. Pouvez-vous
maintenant écrire dans la fenêtre emacs ? Dans le terminal ?
Quelle est la différence entre les commandes fg
et bg ?
La fenêtre emacs ainsi que le terminal sont maintenant utilisables. Les commandes fg et bg relancent toutes les deux un processus suspendu, mais fg le relance en avant-plan (et donc, « bloque » le terminal) alors que bg le relance en arrière-plan (et donc, le terminal reste utilisable).$ bg [1]+ emacs &
-
Utilisez la commande ps pour afficher l'état du processus emacs.
Le processus emacs est bien dans l'état S (il attends que l'utilisateur saisisse quelquechose au clavier)$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 1127 28837 0 80 0 - 127855 - pts/4 00:00:00 emacs 0 R 1000 1921 28837 0 80 0 - 9315 - pts/4 00:00:00 ps 0 S 1000 28837 20963 0 80 0 - 6343 - pts/4 00:00:00 bash
-
Fermez le programme emacs, puis relancez-le en terminant la
ligne de commande par & : emacs &.
Vérifiez que le terminal reste utilisable.
Vérifier avec ps que l'état du
processus emacs est le même qu'à la question
précédente.
Lancer le programme avec la commande emacs & est donc équivalent au lancement sans & suivi de la commande bg.$ emacs & [1] 2047 $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 2047 28837 1 80 0 - 127828 - pts/4 00:00:00 emacs 0 R 1000 2083 28837 0 80 0 - 9315 - pts/4 00:00:00 ps 0 S 1000 28837 20963 0 80 0 - 6343 - pts/4 00:00:00 bash
-
Lors du lancement du processus emacs à la question précédente, deux nombres sont apparus sur le terminal. À quoi correspondent-ils ?
Le nombre 1 correspond au numéro de job du processus créé en arrière-plan.$ emacs & [1] 2047
Le nombre 2047 correspond au PID du processus créé. Cela se vérifie avec la commande ps :$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 2047 28837 1 80 0 - 127828 - pts/4 00:00:00 emacs 0 R 1000 2083 28837 0 80 0 - 9315 - pts/4 00:00:00 ps 0 S 1000 28837 20963 0 80 0 - 6343 - pts/4 00:00:00 bash
Tuer des processus (∼15mn)
Tuer un processus
-
Lancez 2 processus xeyes en arrière-plan.
$ xeyes & [1] 15170 $ xeyes & [2] 15171
-
Retrouvez le PID du premier processus xeyes lancé et utilisez
la commande kill pour le détruire.
Le PID du processus a été affiché lors du lancement du programme ([1] 15170). On peut également le retrouver avec la commande ps :Pour tuer le processus :$ ps PID TTY TIME CMD 5535 pts/2 00:00:00 bash 15170 pts/2 00:00:00 xeyes 15171 pts/2 00:00:00 xeyes 15233 pts/2 00:00:00 ps$ kill 15170
-
Vérifiez que le processus n'existe plus.
Le processus xeyes de PID 15170 n'apparaît plus. De plus, le message ''[1]- Complété xeyes'' (indiquant que le job numéro 1 s'est terminé) est affiché.$ ps PID TTY TIME CMD 5535 pts/2 00:00:00 bash 15171 pts/2 00:00:00 xeyes 15271 pts/2 00:00:00 ps [1]- Complété xeyes
Tuer plusieurs processus
-
Relancez un processus xeyes en arrière-plan et vérifiez qu'il existe bien 2 processus xeyes.
$ xeyes & [3] 15343 $ ps PID TTY TIME CMD 5535 pts/2 00:00:00 bash 13658 pts/2 00:00:25 emacs 15171 pts/2 00:00:02 xeyes 15343 pts/2 00:00:00 xeyes 15477 pts/2 00:00:00 ps
-
Utilisez la commande killall pour terminer tous les processus xeyes en cours d'exécution.
$ killall xeyes [2]- Complété xeyes [3]+ Complété xeyes
Chaîne de processus (∼1h15)
- Vérifie ses arguments. Si le script ne reçoit pas un unique argument, il doit quitter avec un message d'erreur et un code de retour faux.
- Affiche le message « Processus X démarre », où X est le PID du processus.
- Quitte avec un code de retour vrai.
- si N est strictement supérieur à 1, votre script affiche « Il reste K processus à créer », où K est égal à N-1,
- sinon, votre script affiche « Fin de chaîne ».
- Il faut être capable de communiquer le PID du processus initial jusqu'au processus final. Pour cela, nous utilisons une variable nommée pidInitial, initialisée par le processus initial à son PID, et exportée jusqu'au processus final.
- Il faut que le processus initial soit capable de se reconnaître de façon à initialiser et exporter cette variable pidInitial. Tous les processus, sauf le processus initial, vont démarrer avec une copie de la variable pidInitial puisque cette dernière est exportée par le processus initial. Le processus initial est donc l'unique processus pour lequel la variable pidInitial n'est pas définie initialement, c.-à-d., pour lequel la variable pidInitial a pour valeur la chaîne de caractère vide, qui se reconnaît avec la construction [ -z "$pidInitial" ]).
Mettez le script chaine.sh de côté, vous vous en servirez à la prochaine séance.
Chasse au trésor – (∼30mn – hors présentiel)
De retour de vacances, Bilbon décide de reprendre ses notes concernant la généalogie du nain Gimli. Au milieu de ses dossiers, il retrouve le programme genealogie qui, d'après ses souvenirs, permet de modéliser l'arbre généalogique du célèbre nain.
Mise en place de la chasse au trésor
- Récupérez l'archive contenant les notes de Bilbon mise à votre disposition ici.
Comme pour le TP précédent, vous pouvez utiliser la commande wget.
$ wget https://www-inf.telecom-sudparis.eu/COURS/CSC3102/Supports/ci5-processus/exo-chasse-au-tresor/tresor.tgzSi vous êtes sous MacOS, la commande wget n'est toujours pas pas installée par défaut. En remplacement, utilisez curl comme ci-dessous :$ curl https://www-inf.telecom-sudparis.eu/COURS/CSC3102/Supports/ci5-processus/exo-chasse-au-tresor/tresor.tgz --output tresor.tgz
-
Extrayez l'archive dans votre arborescence.
$ tar xzvf tresor.tgz
-
Déplacez vous dans le répertoire ainsi créé et lancez la commande make.
Vous aurez peut-être besoin d'installer auparavant gcc et make : sudo apt install gcc make.$ cd tresor $ make make -C nains make[1]: Entering directory '/tmp/tresor/nains' cc -O0 -g -Wall -lrt balin.c -o balin cc -O0 -g -Wall -lrt durin.c -o durin cc -O0 -g -Wall -lrt dwalin.c -o dwalin cc -O0 -g -Wall -lrt farin.c -o farin cc -O0 -g -Wall -lrt fudin.c -o fudin cc -O0 -g -Wall -lrt gimli.c -o gimli cc -O0 -g -Wall -lrt gloin.c -o gloin cc -O0 -g -Wall -lrt groin.c -o groin cc -O0 -g -Wall -lrt thorin.c -o thorin cc -O0 -g -Wall -lrt oin.c -o oin make[1]: Leaving directory '/tmp/tresor/nains' cc -o genealogie genealogie.c
La chasse au trésor
-
Dans un terminal, lancez le programme genealogie. Préparez un autre terminal pour lancer des commandes pour répondre aux questions.
$ ./genealogie
-
Vous êtes accueillis par Gimli qui va vous aider à mettre en ordre les notes de Bilbon sur sa généalogie. Dans un premier temps, aidez-le à retrouver la fiche concernant son père.
Retrouvez le PPID du processus gimli.Autre solution:$ pstree -p [...] ├─gnome-terminal-(1924)─┬─bash(1928)───emacs(7172)─┬─{dconf worker}(7175) │ │ ├─{gdbus}(7174) │ │ └─{gmain}(7173) │ ├─bash(3918)───genealogie(7347)───durin(7348)───thorin(7349)───farin(7350)─┬─fudin(7351)─┬─balin(7356) │ │ │ └─dwalin(7354) │ │ └─groin(7352)─┬─gloin(7353)───gimli(7357) │ │ └─oin(7355) [...]$ ps -el F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD [...] 0 S 1000 7357 7353 0 80 0 - 2083 - pts/1 00:00:00 gimli -
Gimli se rend compte d'une erreur dans la fiche de son père qui ne mentionne pas sa mort. Corrigez cela dans le programme de généalogie.
Tuez le processus père du processus gimli.$ kill 7353 # (où 7353 correspond au PPID de gimli) -
Vous êtes interrompus dans vos recherche par Oin, l'oncle de Gimli, qui annonce l'heure du goûter. Mais un des nains de la famille se goinfre et est en train de manger toutes les tartes. Retrouvez celui qui s'empiffre.
Trouvez le PID du processus qui consomme beaucoup de CPU.Il s'agit donc du processus 7354 (dwalin)$ top top - 11:37:48 up 2:33, 3 users, load average: 0,96, 0,53, 0,31 Tasks: 197 total, 2 running, 195 sleeping, 0 stopped, 0 zombie %Cpu(s): 3,7 us, 1,8 sy, 0,1 ni, 94,2 id, 0,2 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 8084284 total, 4543160 free, 1068476 used, 2472648 buff/cache KiB Swap: 10157052 total, 10157052 free, 0 used. 6714452 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7354 trahay 20 0 8320 724 628 R 93,8 0,0 2:52.41 dwalin [...] -
Afin que les autres nains puissent participer au goûter, ils décident de punir le responsable en le mettant tout au bout de la table, loin des tartes.
Donnez la priorité 17 au processus glouton.$ renice -n 17 7354 7354 (process ID) priorité précédente 0, nouvelle priorité 17 -
Une fois le glouton puni, le goûter se déroule dans un calme relatif. Mais Gimli sonne la fin de la pause. Il est en effet l'heure de partir à la taverne. Mais les chevaux sont enfermés à clé dans l'écurie. La clé a été confiée à Balin qui a oublié où il l'avait rangé. Il a pourtant noté sur un bout de papier l'endroit où est rangée la clé...
Trouvez le deuxième paramètre qui a été passé au processus balin à son lancement. Selon la méthode utilisée, vous devrez peut-être lancer emacs ou équivalent pour voir les séparateurs des arguments, représentés par ^@.Le répertoire /proc/7356 contient donc des informations sur le processus balin.$ ps -e [...] 7356 pts/1 00:00:00 balinLa réponse est donc 'chaussette' !$ emacs /proc/7356/cmdline balin^@abcdefghijklmnopqrstuvwxyzabcdefg[...]zabcdefghijklmnopqrstuvwxyz^@chaussette^@
Balin retrouve finalement la clé au fond de sa chaussette (il y avait bien quelque chose qui lui faisait mal au pied !)
-
Les nains peuvent donc ouvrir l'écurie et se rendre à la taverne. Pendant que les nains festoient, Bilbon se désole du peu d'avancement de ses recherches...