TP1 Gestion des processus

par Joseph Razik, le 2017-09-26

1   Architecture III - TP N°1 - Gestion des processus sous Unix

1.1   Objectif

L'objectif de ce TP est d'étudier un ensemble de commandes shell sous UNIX/Linux permettant de créer, gérer et détruire les processus d'une machine.

1.2   Préambule

Quelques commandes de base d'un shell Unix

Pour ouvrir un terminal / une console:

  • dans votre gestionnaire de fenêtre préféré (Window Manager) cherchez et sélectionnez un de ces mots clés: gnome-terminal, xterm, urxvt, roxterm, aterm, etc. Il est possible dans certains WM d'entrer la commande cherchée et choisir parmi les résultats qu'il vous propose.
  • une fenêtre s'ouvre, c'est votre terminal

Un terminal est un interprète de commandes, c'est-à-dire qu'il exécute directement les commandes que vous écrivez, sans passer par une phase de compilation. Les commandes et la syntaxe dépend de l'interprète. Pour connaître l'interprète de votre terminal taper la commande suivante (sans oublier de valider):

>$ echo $SHELL

Voici quelques commandes de base qui existent pour tous les interprètes:

  • pwd: retourne le chemin absolu du répertoire de travail courant (working directory)
  • cd [rep]: change de répertoire (change directory) pour aller dans rep
  • ls: liste le contenu d'un répertoire
  • mkdir [rep]: créé le répertoire rep

Pour quitter ou fermer un terminal, vous pouvez soit taper la commande exit, soit faire la combinaison de touches Crtl-D.

Rappelez-vous de la possibilité d'auto-complétion des shells avec la touche de tabulation (TAB).

Les pages man

Pour obtenir de la documentation sur l'utilisation d'une commande, il existe en général deux possibilités: utiliser une option de la commande, ou consulter sa page man. Par exemple pour l'aide de la commande man vous pouvez effectuer soit:

>$ man --help

soit:

>$ man man

La variable d'environnement PATH

Les commandes que vous entrez dans le terminal doivent être connues du système pour être exécutées. Pour cela, soit vous indiquez précisément le chemin permettant d'atteindre cet exécutable, soit une variable d'environnement défini les chemins des répertoires où chercher cet exécutable. Cette variable est la variable PATH. Vous pouvez voir son contenu avec la commande suivante:

>$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Une commande ne se trouvant pas dans ces répertoires ne pourra être exécuter qu'en précisant son chemin d'accès. Par exemple, pour exécuter le programme demoNice qui se trouve dans /home/partage/S51/, si on précise pas le chemin, voici ce que l'on obtient:

$> demoNice
demoNice : commande introuvable

Pour l'exécuter, vous devez donner le chemin (absolu ou relatif) pour y accéder:

$> /home/partage/S51/demoNice

Si vous êtes dans le répertoire le contenant le programme, la spécification du chemin se fait ainsi:

$> ./demoNice

La commande grep

Le répertoire /proc/ contient des informations sur le système d'exploitation en cours d'exécution, les processus etc. Dans ce répertoire, le fichier cpuinfo contient des informations sur le type de cpu sur lequel fonctionne le système.

A l'aide de la commande grep et de ses options déterminez le modèle de processeur, ainsi que le nombre de processeur dans le cpu (c'est grep qui va compter). Vous pourrez dans un premier temps utiliser la commande less ou more afin de savoir quel critère chercher.

1.3   Création de processus

Dans un terminal, il est possible de créer un nouveau processus dit “enfant” à partir d'un processus parent. Pour cela il suffit d'ajouter le caractère spécial "&" après le nom d'une commande (on dit aussi lancement en mode détaché). Avant de revenir au prompt, apparaît un numéro de tâche et le numéro du processus lancé (Pid). Ce numéro identifie de manière unique le processus lancé.

Expérimentez la création de nouveaux processus avec cette commande en lançant plusieurs processus différents ou identiques à partir d'un terminal (un éditeur (gedit)ou une calculatrice (gnome-calculator) ou une horloge par exemple (xclock)).

Points importants dans l'utilisation de "&"

  • Le nouveau processus en tâche de fond ne doit pas attendre de saisie au clavier. Le shell doit avoir le monopole de l'accès au clavier.
  • Le processus en tâche de fond ne doit pas retourner ses résultats sur le terminal. Sinon les sorties de ce processus risquent d'entrer en conflit avec celles du shell ou d'une autre commande (mélange des caractères à l'écran!).
  • Si vous quittez le shell avec la commande exit ou par un autre moyen (Ctrl-C), vous forcerez également la fin des processus lancés à partir du shell si vous n'avez pas utilisé le "&".

1.4   Liste des processus du système

Les caractéristiques importantes d'un processus UNIX sont:

  • Son identification (un nombre entier) ou PID
  • L'identification du processus parent qui l'a créé (PPID)
  • Son propriétaire
  • Son groupe propriétaire
  • Son état
  • Le temps cumulé d'exécution
  • Éventuellement son terminal d'attachement.

La commande ps

Cette commande permet d'obtenir une liste de processus appartenant à un ensemble particulier ainsi que certaines de leurs caractéristiques.

  1. Étudiez les différentes options disponibles, en particulier -l, -e, -f.
  2. Quelle est l'option permettant d'afficher tous les processus du système ?
  3. Quelle est la combinaison de commandes pour afficher la liste de tous les processus qui vous appartiennent ?
  4. Repérez les états des processus.
  5. Repérez la priorité du processus de votre terminal.
  6. Repérez la valeur "nice" du processus de votre terminal.
  7. Pourquoi dans la liste de vos processus apparaît-il la commande ps ?
  8. Comment peut-on repérer des processus enfants d'autres processus ?
  9. Quel est le processus parent de tous les autres ?
  10. Créez de nouveaux processus avec le caractère spécial "&" à partir du terminal et vérifiez la relation parent - enfant.

La commande pstree

Cette commande permet de visualiser sous forme graphique les relations parent-enfant dans la liste des processus du système.

NB: Elle n'est pas installée par défaut dans tous les systèmes.

  1. Étudiez cette commande.
  2. Quelles sont les commandes pour afficher le PID des processus et pour afficher uniquement vos processus ?

1.5   Manipulation des processus entre le premier et l'arrière plan

Les commandes "bg", "fg", "jobs" et Ctrl-Z permettent de manipuler la notion de premier plan et d'arrière plan pour un processus. Elles sont intimement liées au SHELL.

Un processus en avant plan (commande "fg %n° de job" ou "fg n° de job") s'exécute en ayant la main sur le terminal qui l'a lancé. Un processus en arrière plan (commande "bg %n° de job") s'exécute de façon détachée par rapport au terminal qui l'a lancé. La séquence de touche Ctrl-Z suspend l'exécution du processus en cours et rend la main au terminal qui l'a lancé.

La commande "jobs" permet d'afficher les processus activés ou suspendus (STOPPED) et leur numéro. Attention, cette commande n'affiche que les processus lancés à partir du terminal où elle est exécutée.

  1. Ouvrez une fenêtre horloge avec la commande "xclock -update 2" à partir d'un terminal. Que constatez-vous ?
  2. Suspendez-la avec la séquence de touches Ctrl-Z. Que constatez-vous ?
  3. Voyez l'état de ce processus avec la commande "jobs".
  4. Relancez-le en arrière-plan avec la commande "bg". Que se passe-t-il ?
  5. Vérifiez avec la commande "jobs"

1.6   Envoi de messages aux processus

La commande "kill" permet d'envoyer à un ou plusieurs processus un signal prédéfini dans le système (par ex. SIGINT, …) en le(s) référençant par son PID. L’utilisation de la commande "kill" est limitée aux processus appartenant à l’utilisateur sauf pour l'utilisateur root qui peut envoyer des signaux à tous les processus.

  • Expérimentez la commande "kill -l". Qu’affiche-t-elle ? Pour comprendre cet affichage, ouvrez avec gedit le fichier "/usr/include/x86_64-linux-gnu/bits/signum.h".
  • Quel est le signal pour suspendre l'exécution d'un processus. Faites un test avec ce signal sur un nouveau processus que vous avez créé.
  • Quel est le signal (ou les signaux) pour arrêter définitivement un processus ?

On peut, à la place du PID, utiliser le numéro de job affiché avec la commande jobs. Créez un processus détaché (xclock par exemple) et envoyez-lui un signal SIGKILL avec son numéro de job (%n°).

D'autres commandes basées sur kill permettent une utilisation parfois plus adaptée de l'envoie de signal, par exemple killall, pkill ou xkill. Lisez le manuel afin de comprendre les nuances entre ces commandes et expérimentez-les.

1.7   Mesure du temps d'exécution des processus

La commande "time" permet de mesurer le temps d'exécution d'un processus.

Expérimentez la commande "time". Quelles sont les valeurs de temps mesurées ?

Exemple ⇒ "time gedit&"

Exemple ⇒ "time ls -lR /usr/lib > /dev/null &". Calculez pour cet exemple le ratio temps CPU / temps réel.

1.8   La commande top

La commande top permet d'afficher en dynamique certaines valeurs du système (processus, temps, priorité, utilisation mémoire. Vous pouvez quitter cette commande avec la touche 'q'. Par défaut la mise à jour des informations a lieu toutes les 3 secondes. Vous pouvez régler un grand nombre de paramètres avant le lancement de l'exécution (surveiller les processus d'un utilisateur particulier par exemple) ou les changer en cours d'exécution (touche 'h'). Lire les premières pages du man pour découvrir la commande.

  1. Lancez la commande top et visualisez les différents paramètres (mémoire physique, mémoire swap, PID, Priorité, %CPU et MEM).
  2. Notez le nombre de processus running, sleeping, stopped, zombie.
  3. Trouvez la touche permettant en mode interactif d'afficher le réglage des données à visualiser et afficher les données, DATA et CODE.
  4. Sélectionnez uniquement vos processus.
  5. Lancez dans un autre terminal le programme demoNice qui se trouve dans le répertoire /home/partage/S51/. Faire start et observer le comportement des paramètres du processus avec la commande top. Quelle est la charge CPU et mémoire de ce processus ? Pourquoi ?
  6. Arrêtez le programme demoNice et relancez en regardant précisément la valeur de la colonne PR de ce processus dans les infos de top. Que constatez-vous ?

NB: il existe également la commande htop qui est assez similaire mais qui n'est pas forcément installée par défaut.

1.9   Exécution planifiée de processus

Les redirections d'entrée / sortie

La plupart des commandes du shell affiche le résultat de leur exécution directement dans le terminal (par exemple ls) ou bien prenne leur entrée au clavier. Toutefois, il est parfois nécessaire de vouloir donner en entrée le contenu d'un fichier ou le résultat d'une autre commande. Pour faire cela, le shell propose mécanisme de redirection des entrée/sorties.

Sous Linux/Unix, il y existe 3 flux d'entrée/sortie:

  • 0: le flux d'entrée standard (le clavier)
  • 1: le flux de sortie standard
  • 2: le flux d'erreur standard

Pour rediriger vers un fichier la sortie standard sur laquelle est affiché le résultat de la commande, on utilise le caractère spécial >, comme dans la séquence suivante:

$> ls > /tmp/fichiers.lst

Pour concaténer (ajouter à la fin) à un fichier déjà existant et ne pas écraser ce qu'il contenait, il faut utiliser le caractère spécial suivant: >>

$> ls >> /tmp/fichiers.lst

Pour rediriger la sortie d'erreur standard, il faut préciser le numéro de flux. Il faut dans ce cas utiliser 2> ou 2>>.

Pour rediriger les deux flux de sortie à la fois, il faut utiliser 2>&1.

Il est possible de rediriger l'entrée standard pour, par exemple, utiliser le contenu d'un fichier à la place d'écrire ce contenu à la main. Cette redirection se fait avec le caractère <.

Toutefois, une des redirections la plus utilisée est celle qui redirige directement la sortie d'une commande vers l'entrée d'une autre. Le caractère spécial utilisé est |. Cela évite d'être de passer par des fichiers intermédiaires.

Par exemple, pour connaître le nombre de fichiers du répertoire /bin/ commençant par la lettre b, on peut utiliser une combinaison des commandes ls et wc ainsi:

$> ls /bin/b* | wc -l
15
  1. Redirigez vers le fichier /tmp/ficbig.lst les noms des deux plus gros fichiers du répertoire /bin/. Pour cela vous pourrez utiliser les commandes du, sort et head ou tail.

La commande at

La commande "at" permet de planifier le lancement de un ou plusieurs processus de façon automatique à une date donnée.

  1. Expérimentez la commande "at".
  2. Quelle est la commande permettant de rediriger la sortie de la commande "ps -ef" dans un fichier ficsortie dans 3 minutes ?
  3. Quelle est la commande permettant de lister la liste des tâches en attente ?
  4. Quelle est la commande permettant de supprimer une tâche en attente ?

Nb: la commande "at" peut prendre ses commandes à partir d'un fichier ("at -f"). La commande "at" ne peut pas être utilisée avec des commandes ayant une sortie graphique, sauf à rediriger le flux de caractères dans un fichier.