Les processus avec le SHELL


Il est possible d'effectuer certaines opérations sur les processus. Par exemple changer les priorités d'exécution, connaître l'état d'exécution...

Lancer un processus fils

Il y a quatre manières de lancer des processus à partir d'un script:

- soit vous lancez un processus fils, et vous attendez qu'il vous rende un résultat et votre processus père va continuer ensuite en séquence (dans ce cas, vous indiquez le nom de votre commande en lui passant des paramètres dans votre script, éventuellement en précisant le nom du shell devant votre script)

- soit vous voulez lancer un processus fils qui tournera en parallèle du votre voir le paragraphe "Lancement d’un processus fils en arrière plan"

- soit, vous ne voulez plus que votre processus père ne traite les lignes suivantes de votre script, mais qu'un autre processus soit lancé à sa place, Voir le paragraphe "Remplacer le processus courant par un autre".

- Enfin, vous voulez lancer un traitement dit batch: "Détacher un processus d’un terminal (plus exactement du shell)"

Lancement d’un processus fils en arrière plan

En règle générale, le dialogue entre l’utilisateur et les programmes se déroule de manière intéractive. Cependant, il est possible de demander au shell de lancer l’exécution d’un programme en arrière-plan, ce qui permet de continuer le dialogue et d’effectuer des opérations en parallèle.
L’exécution d’une commande en arrière-plan se fait en terminant la ligne de commande par le caractère « & ».
Le shell renvoie après cette demande un numéro PID, qui représente l’identificateur du processus, et invite l’utilisateur à introduire une nouvelle commande.

REMARQUE :
Un processus lancé en arrière-plan s’arrêtera automatiquement si l’utilisateur se déconnecte.
Le processus ne devra pas faire d’accès au clavier ou d’affichage à l’écran (voir à rediriger vers des fichiers cf. Redirection des flux standards).

Remplacer le processus courant par un autre

La commande interne exec [com] remplace le processus courant avec la commande précisée (attention, héritage !).


Détacher un processus d’un terminal (plus exactement du shell)

La commande nohup (en anglais no hang up), ignore le signal SIGHUP. Seule la réception du signal SIGTERM peut alors mettre fin au processus.
Cette commande « détache » ainsi un processus d’un terminal (plus exactement du shell qui a lancé le processus), ceci permet de se déconnecter sans mettre fin aux processus exécutés avec cette commande (Le signal SIGHUP envoyé par le shell lors de la déconnexion n’est alors plus pris en compte par le processus). Cette commande sera utilisée pour des processus de type batch (Plus d'interface possible ! Voir la commande & vu ci-dessus).

La commande nohup entreprend d’office une redirection des entrées/sorties, si celle-ci n’a pas été spécifiée dans la commande elle-même. La commande redirigera le canal de sortie standard et le canal d’erreur standard vers le fichier nohup.out. Le canal d’entrée standard est lié au fichier /dev/null.

Syntaxe : nohup nom_du_programme &

Synchroniser les traitements

Même s'il peut s'avérer utile de lancer des traitements en parallèle, il pourra être nécessaire à un moment de synchroniser tous ces traitements avant d'effectuer une autre série de traitements. D'où la commande suivante:

wait [n] le processus père attend la fin du processus n, sans paramètres, attend la fin de tous les fils.

 

Gérer la priorité des processus

Syntaxe : nice p_nice
Syntaxe : renice p_nice

Où p_nice représente la nouvelle priorité (cf. explication sur les valeurs possibles de p_nice au chapitre : Priorités).
nice permet de donner le niveau de priorité d’un processus au lancement.
renice permet de modifier la priorité d’un processus pendant son exécution (ATTENTION, certains systèmes ne connaissent pas cette commande).

 

Variables du shell

Rappel, les shells sh ou ksh permettent de récupérer le PID de notre processus courant grâce à la commande $$.

Voir le chapitre Variables internes du shell

 

Autre manière de lancer un processus sous Shell

` <-: Non, ce caractère n'est pas un caractère parasite ! Il permet d’affecter à une variable le résultat d’une commande shell grâce au caractère spécial ` (apostrophe inversée). Voir les shells sh ou ksh

Exemple :

X1=`pwd`

echo $X1

X1 recevra le résultat de pwd


Lister les PIDs des processus et les informations concernant ces processus

Syntaxe : ps [options]

La commande ps retourne des informations sur les processus courants de l’utilisateur et si option sur l’ensemble des processus système.

Les informations :
F :indicateurs cumulés précisant l’emplacement du processus dans le système
- en mémoire centrale (01)
- système (02)
- cloué en mémoire
- en cours d’entrée/sortie (04)
- swappé(10)
- tracé par un autre(20)

S :activité du processus
0- non existant
S- en sommeil
W- en attente d’événements (wait)
R- en cours d’exécution
Z- terminé (Zombie)
T- arrêté

UID :numéro du propriétaire du processus
PID :numéro unique du processus
PPID :numéro unique du processus père
STIME :heure de lancement du processus
PRI :priorité du processus (plus la valeur est grande, plus la priorité sera faible)
ADDR :adresse mémoire ou adresse de swap
SZ :nombre de blocs mémoire utilisés par le processus
WCHAN :événement attendu par le processus S ou W
TTY :numéro du terminal ou ?
TIME :temps d’exécution cumulés
CMD :commande en cours d’exécution

Options :
-e infos sur tous les processus
-a infos sur les processus utilisateur
-f liste complête de tous les processus
-l liste longue des infos
-tx,x,etc…liste des processus rattachés aux terminaux indiqués

- A tous les processus

-- forest affiche les liens de parenté entre processus.