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.