Module 1
Chapitre 08 - Gestion des processus
1. La vie d'un processus
Un processus durant tout sa vie évolue par états et ce jusqu'à sa mort. Les principaux états connus sont : l'état "actif", désigné comme tel lorsque le processus est pris en charge par le processseur, l'état "prêt", indiquant que le processus attend sa prise en charge par le processeur et l'état "attente" permettant au processus de se mettre en mode sommeil afin d'attendre l'arrivée d'un signal qui le passera à l'etat prêt. Il existe beaucoup d'autres états qui seront mis en évidence par l'utilisation de certaines commandes.
Une fois un processus lancé, le système lui affecte non seulement une identification numérique unique portant le nom de PID (Process Identifier) permettant de le reconnaître dans la masse des processus mais aussi un héritage. En effet lorsqu'un processus est lancé celui-ci fait partie d'une descendance, tout processus est le "fils","le petit fils" , ou "l'arrière petit fils" d'un processus parent dénommé "init". C'est le premier processus lancé par le système et c'est lui qui prend en charge l'exécution de l'ensemble des processus lancés par l'utilisateur par l'intermédiaire du shell (interpréteur de commande).
Ainsi le processus init a un pid égale à 1. De même qu'il existe des commandes indiquant l'état d'un processus, des commandes mettant en evidence l'arbre généalogique d'un processus existant.
Voyons un peu l'ensemble de ces commandes :
Commande | Description |
ps | Permet de lister les processus suivant un certain nombre de critères |
top | Permet d'avoir un suivi de l'évolution des processus et ce faisant, d'effectuer des traitements comme on pourrait le faire avec ps, mais de façon interactive |
pstree | Permet de lister les processus dans un arbre indiquant les liens de parentés entre eux |
jobs | Permet de lister les processus lancés dans le shell courant |
Découvrons plus précisément les sorties des commandes ps et top qui sont similaires : elles possèdent des champs définis ainsi :
PID | Identifiant du processus |
USER | Le propriétaire du processus |
PRI | Priorité de la tâche (plus le chiffre est petit plus la tâche est prioritaire) |
SIZE | Taille du processus en mémoire incluant la partie données et la pile |
RSS | Quantité totale de mémoire occupée par la tâche (les bibliothèques chargées sont comptabilisées pour les programme ELF) |
SHARE | Quantité de mémoire partagée |
STAT | Ce champ identifie par des lettres les différents états possibles pour un processus
|
LIB | Nombre de pages occupées par les bibliothèques (sauf pour les exécutables au format ELF ; autant dire que ça ne fonctionne quasiment jamais) |
%CPU | Taux d'occupation du(des) processeur(s) par ce processus. Il peut être supérieur à 100% dans le cadre de machine ayant plusieurs processeurs |
%MEM | Taux d'occupation de la mémoire physique du processus |
TIME | Temps total d'exécution au sein du(des) processeur(s) depuis le lancement du processus |
COMMAND | Affiche la ligne de commande qui a permis de lancer le processus |
2. Envoi de signaux aux processus
Ce procédé se concentre essentiellement autour de la commande kill. Il n'est pas, comme son nom pourrait le laisser supposer, dédié à tuer des processus. Il va permettre de faire effectuer un certain nombre de tâches à l'un ou plusieurs d'entres eux.
Tout dépend, finalement, de comment réagissent les programmes aux signaux qui leurs sont envoyés.
Pour obtenir la liste des signaux disponibles, il suffit de taper dans l'invite de commande du shell : kill -l
Voici dans un tableau les principaux signaux utilisés :
Nom du SIGNAL | Nombre | Description |
SIGHUP | 1 | Ce signal est envoyé directement lors de la déconnection à un modem ou oblige un daemon à relire son fichier de configuration |
SIGKINT | 2 | Ce signal est équivalent au Ctrl-C et met fin à l'exécution d'un processus |
SIGKILL | 9 | Tue un processus de manière immédiate. Ce signal est à envoyé dans des mesures drastiques et ne peut être ignoré par le processus |
SIGTERM | 15 | Termine un signal "proprement" si possible |
SIGTSTP | 18 | Mets un processus en attente et , équivalent à Ctrl-Z |
3. Arrière plan / Avant plan / Détachement
Lorsque vous lancez un programme, le shell prend en compte l'exécution du processus, ainsi il faut attendre la fin de celui-ci avant d'avoir à nouveau le prompt. On dit que le processus est en "Avant Plan" dans cet état il peut recevoir directement des signaux par les combinaisons de touches Ctrl-?. Il existe un autre mode dans lequel le processus est dit en "Arrière plan", contrairement au mode "Avant Plan" lors de l'exécution du programme, le shell affiche le prompt directement sans attendre la fin du processus. Afin de mettre le processus dans ce mode il suffit de placer un "&" à la fin de la commande, il est ainsi vu comme un job possédant un numéro, attaché au terminal (tty) ou pseudo terminal (pts/?) dans lequel il a été lancé. Dans cet état aucun caractère de contrôle (Ctrl-?) n'est possible.
Si nous nous trouvons dans les cas présentés plus haut, nous savons dès le départ dans quel mode nous voulons être, mais imaginons que l'on voudrait "switcher" d'un état à un autre. Des commandes ont été crées spécialement à cette effet.
Commande | Description |
fg %N° de Job * | Permet de mettre un processus en avant plan |
bg %N° de Job * | Permet de mettre un processus en arrière plan |
Ctrl-Z | Permet de mettre un processus en attente |
* : lorsque vous utilisez ces commandes et que vous avez mis un processus en attente, il met le processus dans l'état prêt et dans le mode pour lequel il a été crée.
Toutes les commandes que nous avons vues jusqu'à maintenant sont placées dans un mode d'arrière ou d'avant plan mais le processus est attaché à un terminal. Il existe un mode appélé mode de "détachement" où un processus n'est attaché à aucun terminal ou pseudo terminal. Généralement c'est le cas des daemon. On indentifie facilement un daemon par le champ TTY d'une sortie des commandes ps ou top ou il y a le symbole "?"
La commande permettant le détachement des processus est : disown et possède un paramètre qui est le PID du processus.
Exemple :
disown 1394
4. Modification des priorités du Scheduler
Nous avons vu en introduction que les processus avaient des priorités et qu'elles étaient modifiables. En effet les propriétés évoluent sur une échelle de -20 à +19. Tout processus, au lancement, peut avoir une priorité quelconque supérieure ou égale à zéro. Par contre un processus lancé par un utilisateur, à son exécution et durant celle-ci ne peut avoir une priorité négative. Seul l'administrateur système possède ce droit. Par défaut un processus est lancé avec la priorité 10.
les commandes permettant de contrôler les priorités des processus sont nice et renice.
Commande | Description | Options |
nice priorité | Permet d'affecter une priorité aux processus dès leur lancement | -n N :permet d'ajuster la priorité par défaut à N |
renice priorité | Permet de modifier la priorité d'un processus alors que celui-ci est déjà lancé | -u "User" :change la priorité de tous les processus d'un utilisateur |
-p "PID" : change la priorité d'un processus ayant un pid précis
5. Planification de tâches
Il est possible de planifier des tâches sur linux afin que celles-ci s'éxécutent de manière répétitives ou différées. Pour cela deux daemons existent l'un crond qui est le daemon permettant d'éffectuer des tâches répétitives et le daemon atd destiné aux tâches différées. Chacun de ces deux daemons possèdent une commande en premier plan : crontab pour crond et at pour atd. Cependant beaucoup de ces commandes ne peuvent pas être utilisés par n'importe qui.
Pour gérer les accès à ces commandes, l'administrateur dispose de fichiers de permissions situés dans le répertoire /etc : cron.allow et at.allow qui definissent les autorisations et cron.deny et at.deny les refus.
Selon la présence ou l'absence de ces fichiers plusieurs règles rentrent en jeu :
Aucun des fichiers n'existe : dans ce cas seul root à le droit d'utiliser les commandes
Note: dans le cas d'un système RedHat l'abscence des fichiers donne le droit à l'ensemble des utilisateurs d'utiliser les commandes Les fichiers cron.allow et at.allow existent : les utilisateurs dont les noms sont présents sont abilités à exécuter les commandes
Les fichiers cron.deny et at.deny existent : les utilisateurs dont les noms sont présents ne peuvent exécuter les commandes les autres oui.
5.1 La commande crontab
Il est important de ne pas faire l'amalgame entre la commande crontab et le fichier crontab. La commande crontab permet de créer un fichier crontab possédant les différentes requêtes que l'utilisateur veut effectuer. Ce fichier porte le nom de l'utilisateur et est stocké dans le répertoire /var/spool/cron avant d'être exécuté par crond. Cette commande permet notament d'éditer le fichier et d'en supprimer le contenu.
Voici dans un tableau récapitulant les différentes options possibles:
Option | Définition |
-u utilisateur | Installation du fichier crontab pour utilisateur (nécessaire d'être root pour l'utiliser) |
-e | Modification du fichier crontab à l'aide de l'éditeur spécifié par les variables VISUAL ou EDITOR |
-l | Liste le contenu du fichier crontab courant |
-r | Elimination du fichier crontab courant |
Le fichier crontab créé par l'utilisateur est composé de cinq champs marquant la périodicitété et la commande à effectuer. Ces champs sont ainsi définis:
Minute heure date mois "jour du mois" commande
La périodicité de chacun de ces 5 champs est représentée par des valeurs numériques comme ci dessous:
minutes (0-59)
heures (0-23)
date (0-31)
mois (1-12)
jour de la semaine (0-7)ou (0 ou 7 indique le Dimanche)
Vous pouvez affiner la notion de périodicité par l'utilisation de:
, : sépare plusieurs valeurs
- : marque une période (exemple: 1-7,du lundi au dimanche)
* : représente l'ensemble des valeurs possibles
/ : permet de spécifier tous les x temps (exemple: */2 dans la colone des jours veut dire chaque 2 jours).
| Note: | |
| vous pouvez séparer les champs d'une entrée par des espaces simples, ou de tabulations. |
5.2 Le fichier crontab système
Le fichier /etc/crontab est également lu par le daemon crond et est différent du format d'un fichier crontab ordinaire, en effet celui-ci possède des informations d'environnement qui précèdent généralement ses entrées (cela est aussi permis pour les fichiers crontab ordinaires mais ce n'est pas souvent utilisé). Après les cinq champs initiaux se trouve le nom d'un utilisateur pour lequel la commande doit être appelée.
Ce fichier est généralement utilisé pour appeler les scripts contenus dans les répertoires "cron.periode" se situant dans le répertoire /etc,énumérés ci-dessous :
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.* répertoire contenant les exécutables
L'autre différence du fichier système crontab est qu'il fait appel à une commande particulière : run-parts. Cette commande prend en argument un nom de répertoire et appelle tous les programmes compris dans ce répertoire (le programme run-parts se trouve dans /usr/bin et n'est accompagné d'aucune documentation en ligne).
Voici un exemple de fichier /etc/crontab:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/bin:/usr/sbin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * * root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
Ainsi, chaque matin, à 4:02, tous les scripts (ou programmes du répertoire /etc/cron.daily sont exécutés. Le répertoire cron.daily est créé lors de l'installation de votre distribution et contient des scripts servant à mettre à jour les bases de données slocate et whatis, à nettoyer les répertoires temporaires et à exécuter d'autres tâches de maintenance.
5.3 La commande at
at est un outil pratique pour planifier un seul évènement futur, et son utilisation est très simple:
Exemple :
luser@localhost $ at 6:00 ;
mail joe < joe.msg
Beaucoup d'autres commandes utilisent le daemon atd :
la commande atq (pour at queue, la file d'attente de at), fournit une liste des travaux at actuellement en cours. Tout utilisateur privilégié (root) peut entrer un nom d'utilisateur comme argument pour obtenir les travaux en cours d'autres utilisateurs.
la commande atrm est utilisée pour éliminer les travaux at en cours. L'atJobID s'affiche lorsque le travail est soumis ainsi qu'à la demande de la commande atq. Tout utilisateur privilégié peut éliminer les travaux at d'autres utilisateurs en fournissant le nom d'utilisateur (user ID) de ceux-ci.
Les commandes peuvent être indiquées (une par ligne), en terminant l'entrée par Ctrl-d seul, sur sa propre ligne.