Informations générales sur la gestion des processus sous Unix
1) Définition
Le terme processus désigne un programme binaire en cours d'exécution, c'est-à-dire un programme dans un environnement. Cet environnement comprend :
- un numéro d'identification unique appelé PID (Process IDentifier).
- le numéro d'identification de l'utilisateur qui a lancé ce processus, appelé UID (User IDentifier), et le numéro auquel appartient l'utilisateur, appelé GID (Group IDentifier).
- les fichiers ouverts par le processus.
- le masque de création de fichier, appelé umask.
- le répertoire courant.
- la taille max des fichiers que ce processus peut créer, appelée ulimit.
- la priorité.
- les temps d'exécution.
- le terminal de contrôle, c'est-à-dire le terminal à partir duquel la commande à été lancée.
2) Commandes liées aux processus
pwd affiche le chemin du répertoire courant
umask affiche le masque de création de fichier
id affiche l'UID et le GID
logname affiche le nom associé à l'UID
Le PID est stocké dans une pseudo-variable que l'on appelle $$. On peut afficher le PID du shell courant via la commande echo $$
ps affiche les processus en cours.
ex: ps -eaf : affiche les informations sur tous les processus en cours.
3) Création de processus
Pour chaque commande lancée (à l'exception des commandes internes), le shell crée automatiquement un nouveau processus. Il y a donc 2 processus. Le 1er, appelé processus père, exécute le programme shell et le 2ème , appelé processus fils, exécute la commande. Le fils hérite de tout l'environnement du père, sauf bien entendu du PID, du PPID et des temps d'exécution ; le PPID représente le PID du processus père. Les deux processus peuvent tourner en parallèle.
Pour lancer un traitement très long et continuer à travailler en même temps, ils est possible de lancer un processus en background (ou arrière plan) en faisant suivre la commande du caractère '&'.
Vous pouvez également lancer successivement plusieurs commandes en arrière plan en utilisant les paranthèses.
ex: (commande1; commande2)&
Dans ce cas, la commande2 ne sera lancée qu'une fois la commande1 terminée.
La commande
wait n permet d'attendre la mort du processus en background.
4) Arborescence de processus
Tous les processus sont crées à partir d'un processus père existant déjà. Le premier processus est un peu spécial. Il est crée lorsque le système est unitialisé. Il s'appelle
init, à le PID 1 et n'est rattaché à aucun terminal. Son rôle est de créer de nouveaux processus ; il en crée 2 sortes :
- les démons, c'est-à-dire des processus qui ne sont rattachés à aucun terminal, qui sont "endormis" la plupart du temps mais qui se réveillent de temps en temps pour effectuer un tâche précise (par exemple la gestion des imprimantes).
- les processus interactifs, associés aux lignes d'entrées/sorties sur lesquelles sont rattachés des terminaux. Autrement dit des processus vous permettant de vous connecter.
5) Identificateur réels et effectifs
A chaque processus sont en fait associés deux groupes d'identifications :
- l'UID et le GID réels identifient l'utilisateur qui a lancé le processus.
- l'UID et le GID effectifs (EUID et EGID) identifient les droits du processus.
Le plus souvent, les identités réelles et effectives sont identiques. Cependant, il peut être nécessaire de modifier les droits d'un processus.
Par exemple, le fichier
/etc/passwd est protégé en écriture. Aucun utilisateur n'a le droit d'écrire dans ce fichier. Cependant, en utilisant la commande
passwd (/bin/passwd), vous écrivez quand même dans ce fichier puisque vous modifiez votre mot de passe.
Si vous faites un 'ls -l
/bin/passwd', vous remarquerez que ls affiche un 's' à la place du caractère 'x' habituel montrant que ce fichier a le mode "set user ID" et "set group ID". Dans ce cas, l'EUID et le EGID du processus sont ceux du propriétaire du fichier exécuté (et non pas ceux de l'utilisateur qui l'a lancé). Ainsi quiconque lance l'exécutable
passwd, travaille avec l'UID effectif de root et GID de sys.
6) Signaux
Un signal est un message qu'un processus peut envoyer à un autre processus. Il existe une vingtaine de signaux numérotés à partir de 1. Envoyer un signal revient à envoyer ce numéro à un processus.
Voici les principaux signaux :
SIGHUP (1) : il est envoyé lorsque la connexion physique de la ligne est interrompue
SIGINT (2) : interruption du processus via un terminal (Ctrl+C, Break, DEL)
SIGKILL (9) : tue un processus
SIGTERM (15) : fin normale d'un processus
Pour envoyer un signal, on utilise la commande kill avec en option le numéro du signal souhaité (par défaut, le signal 15 est utilisé).
Il est possible de lancer un processus qui ignore le signal SIGHUP, c'est-à-dire que le processus continuera à tourner même si son père shell meure.
Cela se fait en utilisant la commande:
nohup cmd
La commande
nohup crée un fichier ./nohup.out dans lequel elle met l'affichage de la commande lancée avec
nohup.
Il existe une commande très pratique destinée à intercepter les signaux et d'y associer un traitement ; cette commande est
trap.
trap commande numéro_de_signal
ex: trap "echo le signal 3 a ete recu" 3
Si le signal 3 arrive, la commande "echo le signal 3 a ete recu" sera exécutée.
Vous pouvez voir les différents traitements associés aux signaux en tapant trap sans argument.
Le pseudo signal 0 est reçu par le processus lorsque celui-çi se termine. Vous pouvez donc lui associer un traitement, par exemple la destruction des fichiers temporaires.
7) Statut d'un processus
Lorsqu'un processus se termine, il retourne toujours une valeur significative appelée également statut.
Par convention, lorsqu'un processus se termine correctement, il retourne la valeur 0, sinon, il retourne une valeur différente de 0. Ce choix permet de ramener des codes significatifs pour différencier les erreurs.
Lorsque le shell lance une commande et attend qu'elle se termine, il place son statut dans une pseudo-variable nommée '
?'
Vous pouvez consulter cette valeur en tapant la commande :
echo $?
8) Priorités
Le système affecte une priorité à l'exécution d'un processus. Cette priorité peut être modifiée par le système en cours d'exécution suivant l'action du processus ou le nombre de processus sur le système. Il est possible de pondérer la priorité d'un processus. Cette pondération se situera dans une fourchette allant de 0 à 40. Plus le nombre est grand, plus la priorité est faible. Un processus interactif est par défaut à 20. Tout processus peut baisser sa priorité mais jamais l'augmenter ; sauf l'administrateur qui pourra diminuer jusqu'à 0. Le système utilisera la pondération pour affecter une priorité au processus. Pour modifier la pondération, on utilise la commande
nice.
nice -n cmd
Le shell va lancer la commande
cmd en baissant sa priorité de n par rapport à la priorité courante.
NB. Les champs
NI et
PRI de la commande
ps -l donnent la pondération demandée (NIce) et la valeur réelle (PRIority) donnée par le système. La pondération est demandée (sa valeur sera fixe en cours d'exécution) alors que la valeur réelle sera recalculée en permanence par le système suivant sa charge.