26 0 111KB
Compte rendu du TP n°6 Gestion des processus et signaux sous Linux (partie 1) RAHAL Majda Nafissa - 7/05/2012
Exercice 1 : 1. Rôle des commandes : bg : exécuter une tâche en arrière plan (BackGround) Schéma : bg pid fg : (re)mettre une tâche au premier plan (ForeGround) Schéma : fg pid jobs : afficher la liste des processus en arrière plan Schéma : jobs ps : lister les processus en cours d'exécution (dans le terminal où on l'a exécutée) Schéma : ps ou ps l pour la forme longue avec l'id du père pstree : afficher une arborescence des processus en cours d'exécution Schéma : pstree kill : envoyer un signal Schéma : kill pid (pid du processus auquel on veut envoyer le signal) killall : envoyer un signal à tous les processus Schéma : killall * On peut aussi faire killall nomExterneProc pour envoyer un signal à toutes les copies d'un même programme. Note : Dans les schémas, nous avons volontairement omis certaines options. 2. On crée le programme suivant en C, et qui fait une boucle vide infinie : int main(){ while(1); } On compile avec gcc o boucle boucle.c Puis on l'exécute avec ./boucle 3. Pour obtenir le pid de ce programme ainsi que celui de son père, on ouvre un autre terminal (on ne peut pas le faire dans le même terminal vu que le programme boucle est toujours en cours d'exécution), et on tape : ps al L'option a sert à afficher tous les processus en cours (même ceux créés dans d'autres terminaux). L'option l (pour long listing) sert à afficher la forme longue de ps (c'est-à-dire celle avec le pid du père, entre autres). On a ce qui suit comme résultat : F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 R 1000 4657 3915 99 80 0 425 pts/0 00:08:20 boucle 0 R 1000 4760 4661 0 80 0 1124 pts/2 00:00:00 ps
4. En pressant la combinaison Ctrl+Z on suspend le programme en cours (mais on ne l'arrête pas totalement). page 1
Dès qu'on appuie sur les 2 touches, [1]+ Stopped ./boucle s'affiche. Le 1 est l'identité du job et le + veut dire que c'est le dernier job suspendu. Notons enfin que Ctrl+Z est le raccourci clavier équivalent au signal SIGTSTP du kill. 5. En exécutant la commande ps (après avoir suspendu le programme avec Ctrl+Z), on remarque que le processus se trouve maintenant dans l'état T (pour Trapped) qui veut dire qu'il est mis en arrière plan et il est suspendu. Notons que le processus se trouvait avant cela dans l'état R (pour Running) c'est-à-dire qu'il s'exécutait au premier plan. 6. On remet boucle au premier plan en exécutant la commande : fg 1 Le numéro 1 correspondant au numéro interne du job. 7. En pressant la combinaison Ctrl+C ou Ctrl+D on termine le programme en cours d'exécution, ceci est équivalent à faire un kill INT 4657 (ou encore kill 4657 tout simplement). 8. On refait les questions 4 et 7 mais cette fois avec la commande kill : Ctrl+Z (suspension) est équivalente à kill TSTP 4657 Ctrl+C (terminaison) est équivalente à kill INT 4657 On remarque donc que l'envoi de signaux à un processus peut se faire à l'aide de raccourcis claviers mais aussi de commandes à partir du terminal. 9. On lance un processus en arrière plan en exécutant : bg ./boucle ou bien ./boucle & La différence avec la première méthode (lancer un processus puis le mettre en arrière plan) c'est qu'ici le processus est bien en arrière plan mais il est dans l'état running au lieu d'être stoppé (ce qui est confirmé par la commande ps a). L'utilité d'une telle démarche est de permettre le basculement entre tâches. En effet, si une commande prend un certains temps à s'exécuter (ou s'exécute indéfiniment), le shell ne nous donnera pas la main tant que la commande n'est pas terminée ; on est alors obligés de lancer un autre shell pour taper une autre commande. Le fait de lancer cette commande en tâche de fond, nous permet de l'exécuter mais de reprendre aussitôt la main sur le terminal. 10. La commande à taper pour afficher la liste des processus en arrière plan est jobs (sans arguments). Exercice 2 : 1. On saisit le script donné et on l'exécute à l'aide de la commande suivante : bash script.sh Ce script incrémente indéfiniment (boucle infinie) et à chaque itération, la valeur d'une variable i de 1 puis l'affiche. Il y a un sleep 2, qui crée une attente de 2 secondes avant la fin de chaque itération (pour espacer les affichages). 2. Pour afficher la hiérarchie des processus en faisant ressortir la branche depuis laquelle script.sh est exécuté (elle sera affichée en gras), on utilise l'option H de la commande pstree comme suit : pstree H 2908 page 2
2908 étant le pid de notre processus que l'on obtient au préalable à l'aide de la commande ps fa (exécutée dans un autre terminal). L'option f de ps permet d'afficher une liste étendue de processus. 3. La commande top permet d'afficher des informations rafraîchies dynamiquement et en temps réel à propos des processus s'exécutant sur la machine. Parmi ces informations, on trouve la consommation en mémoire virtuelle et centrale (avec VIRT et RES respectivement), ainsi que la consommation CPU (pourcentage indiqué par %CPU). Dans notre cas, on a l'affichage suivant (qui change en fonction du temps), en exécutant : top p 2908 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2908 majda 20 0 5012 1428 1108 S 0 0.1 0:00.84 bash
4. On interrompe l'exécution du script à l'aide de Ctrl+Z, le programme passe alors en arrière plan et à l'état stoppé. 5. Deux manières pour arrêter le processus suspendu : - en envoyant un signal SIGTERM (kill TERM 2908) pendant que le processus est suspendu. Le signal ne sera pas exécuté de suite mais sera mémorisé. Dès que l'on reprend l'exécution du processus avec fg, celui-ci sera stoppé. - on reprend l'exécution du processus puis on lui envoie un signal SIGTERM avec kill, le processus sera alors immédiatement stoppé. 6. Pour sauvegarder la valeur de i dans un fichier au lieu de l'afficher à l'écran, on modifie ce qui suit dans le script (à la 2e instruction de la boucle) : echo « Valeur de i : $i » >> hello Ceci aura pour effet d'envoyer le texte au fichier hello (même s'il n'existe pas, il sera créé). On exécute maintenant le programme pour qu'il soit indépendant du terminal et qu'il continue donc à s'exécuter après la fermeture de celui-ci. On utilise ceci : nohup bash script.sh Ceci nous affichera à l'écran que les entrées sont ignorées et les sorties iront vers nohup.out. Maintenant, quand on ferme le terminal, le programme continue à s'exécuter et la valeur de i à s'incrémenter (on peut le voir dans le fichier hello).
page 3