UNIX/Linux permettent de gérer des processus de manière parallèle: pendant qu’un logiciel est exécuté, un autre peut également l’être. Ceci donne l’illusion que les deux programmes fonctionnent en parallèle.
Nous présentons ici quelques fonctionnalités du shell. Même si vous n’utilisez pas toutes les fonctionnalités, il est utile de les connaître, dans le cas où vous en auriez besoin.
Prenons un garage spécialisé dans le changement de pneumatiques.
Dans ce garage, un programme est très souvent exécuté:
Un opérateur exécute ce programme quand un véhicule se présente:
Si un autre véhicule doit avoir ses roues changées, l’opérateur va mettre de côté l’exécution du processus de changement de roue sur le premier.
Puis revenir sur le premier véhicule pour terminer le premier processus:
Le programme de changement de pneus est la suite d’opérations à effectuer.
Le processus intègre :
Suite d’opérations à effectuer
Dans ce document, quand vous rencontrez :
$ sleep 5
<wait 5 seconds>
$
sleep 5
Quand vous voyez <Ctrl-C>
, cela signifie que vous
devez enfoncer la touche Ctrl et la touche C en
même temps (pour cela, enfoncer d’abord la touche Ctrl puis
presser brièvement et relâcher la touche C, et relâcher la
touche Ctrl).
Quand vous lancez :
sleep 5
le processus se met en pause pendant 5 secondes.
Vous exécutez cette commande en foreground. Ce qui signifie que le shell attend la fin de la commande avant de vous “rendre la main”. Maintenant exécutez :
$ sleep 6000
<Ctrl-C>
$
Quand vous pressez la séquence de touche, vous envoyez un signal de terminaison au processus actuel (celui qui s’exécute en avant plan), ce qui fait que vous n’avez pas à attendre 6000 secondes avant de pouvoir exécuter une nouvelle commande.
Plutôt que de lancer une commande en foreground (avant-plan), on peut la lancer en background (arrière-plan).
Ceci se fait simplement en rajoutant un &
après la
commande.
$ sleep 6000 &
[3] 27181
$
En exécutant cette commande en arrière plan, le prompt “revient” immédiatement. De plus Unix, vous indique que le job que vous venez de lancer est le numéro 3, et que son numéro de processus est le 27181 (dans cet exemple).
Le shell garde une trace de tous les jobs en cours d’exécution. La commande jobs permet de les afficher
> jobs
[2] - running evince TDUnixJobs.pdf
[3] + running sleep 6000
L’affichage des informations sur les processus se fait par la
commande ps
:
$ ps
PID TTY TIME CMD
3342 pts/2 00:00:00 bash
3361 pts/2 00:00:00 sleep
3362 pts/2 00:00:00 ps
$
On peut ajouter des options à la commande ps
et la
filtrer avec la commande grep
:
$ ps -elf | grep sleep
0 S laurent 3089 2525 0 80 0 - 1803 restar 10:15 pts/0 00:00:00 sleep 6000
0 S laurent 3361 3342 0 80 0 - 1803 restar 11:20 pts/2 00:00:00 sleep 6000
0 S laurent 3365 3342 0 80 0 - 2945 pipe_w 11:25 pts/2 00:00:00 grep --color=auto sleep
$
Et même rajouter l’entête des colonnes:
$ ps -elf | head -1 ; ps -elf | grep sleep
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
0 S laurent 3089 2525 0 80 0 - 1803 restar 10:15 pts/0 00:00:00 sleep 6000
0 S laurent 3361 3342 0 80 0 - 1803 restar 11:20 pts/2 00:00:00 sleep 6000
0 S laurent 3365 3342 0 80 0 - 2945 pipe_w 11:25 pts/2 00:00:00 grep --color=auto sleep
$
ps aux
On peut aussi voir ce processus en faisant :
$ ps aux | grep sleep
laurent 27181 0.0 0.0 7308 704 pts/4 SN 15:26 0:00 sleep 6000
laurent 27430 0.0 0.0 14272 964 pts/4 S+ 15:33 0:00 grep sleep
$
Comment faire pour terminer ce job ? Il y a plusieurs façons :
$ kill 27181 # En utilisant son pid
$ kill %3 # En utilisant son numéro job
$ fg # puis <Ctrl-C>
fg
ramène le processus à l’avant-plan, il peut être
interrompu avec la combinaison CtrlC
Vous pouvez aussi mettre en background une commande que vous venez de lancer, en exécutant
$ sleep 6000
<Ctrl-Z>
ˆZ
[1] + 28640 suspended sleep 6000
$ bg
[1] 28640 continued sleep 6000
Parfois un processus peut refuser de se terminer:
Si nécessaire, il est possible de forcer l’arrêt du processus. Mais cela peut l’empêcher de se terminer correctement et peut parfois générer des erreurs (système de fichiers).
Pour forcer un arrêt, on ajoute l’option -9
:
kill -9 27181
Vous pouvez lancer le téléchargement de différentes pages de ce guide.
Par exemple :
wget --limit-rate=1 http://tstn1.aezi.fr/ecole-23-24/processus.html
Pour reprendre un téléchargement tué, utiliser l’option
--continue
wget --continue --limit-rate=1 http://tstn1.aezi.fr/ecole-23-24/processus.html
Lancera le téléchargement de la page processus.html
dans
le répertoire courant.
Observer ce qui se passe avec la commande ps
Observer ce qui se passe lorsque le processus est stoppé ou en cours
d’exécution (raccourci CtrlZ et commandes
fg
et bg
).
Utiliser la commande tail -f processus.html
pour
observer l’état du fichier téléchargé.
En utilisant --limit-rate=1
télécharger en parallèle les
fichiers:
Observer l’évolution de chaque téléchargement avec la commande
tail -f
Installer le paquet x11-apps
et lancer par exemple les
commandes suivantes:
xeyes
xclock
xman
Utiliser la commande top
Le programme screen
permet d’exécuter des processus dans
des terminaux virtuels.
Il permet notamment d’exécuter un processus, de fermer un terminal, puis de retrouver le processus plus tard.
sudo dnf install epel-release -y
sudo dnf install screen
sudo apt install screen
Exécuter la commande screen
screen
wget --limit-rate=8 http://tstn1.aezi.fr/ecole-23-24
Taper successivement les combinaisons de touches suivantes:
Ctrla puis d
Vous êtes maintenant détaché du processus screen
screen
en cours d’exécutionscreen -ls
Cette commande affiche une sortie du type:
There are screens on:
80330.pts-0.centos (Detached)
50522.pts-3.centos (Detached)
2 Sockets in /run/screen/S-supv.
Par exemple, pour rattacher la session screen
80330.pts-0.centos
commencer à taper:
screen -r 80
Puis appuyer sur la touche ⇥ (Tabulation)
La ligne se complète automatiquement.
Appuyer sur la touche ↵ (Entrée)
Si une de mes sessions est déjà attachée:
$ screen -ls
There are screens on:
80330.pts-0.centos (Attached)
50522.pts-3.centos (Detached)
2 Sockets in /run/screen/S-supv.
Je peux m’y connecter en la détachant au préalable.
Pour cela, j’utilise l’option -d
:
screen -d -r 80330.pts-0.centos
Dans screen
appuyer sur Ctrla puis
appuyer sur la touche [
Sous Windows: [
s’obtient avec la combinaison
AltGr5
Sous Mac: [
s’obtient avec la combinaison
Alt⇧5
Ensuite, utiliser Ctrld et Ctrlu pour faire défiler l’écran respectivement vers le bas (down) et vers le haut (up)
Appuyer sur q pour quitter le mode défilement
Essayer par exemple d’appeler la commande ls -R /
Dans une session screen
taper la séquence de touches
Ctrla, :
En mode commande, il est possible d’exécuter différentes commandes spécifiques:
detach
(équivalent de la séquence
Ctrla, d)help
Le raccourci Ctrla est utilisé dans un terminal standard pour revenir au début de la ligne.
Il ne fonctionne plus directement dans screen
.
Pour le faire fonctionner, utiliser la séquence suivante:
Ctrld ou exit
screen
tmux
offre une alternative à la commande
screen
Le raccourci principal pour utiliser les fonctions de
tmux
est CtrlB (au lieu de
CtrlA dans screen
).
tmux
tmux
Depuis une session tmux
:
CtrlB puis D.
Depuis un terminal:
tmux ls
Depuis un terminal:
tmux attach
# OU
tmux a
Ou si la session est nommée:
tmux attach -s nom_de_la_session
Depuis un terminal:
tmux -s new nom_de_la_session
Depuis une session tmux
:
CtrlB puis C.
Depuis une session tmux
:
CtrlB puis W.
Depuis une session tmux
:
CtrlB puis ,.
Depuis une session tmux
:
CtrlB puis P.
Depuis une session tmux
:
CtrlB puis N.
Depuis une session tmux
:
CtrlB puis &.
Chaque fenêtre est numérotée de 0
à N (ou N est égal au
nombre de sessions - 1
)
Depuis une session tmux
:
Depuis une session tmux
:
CtrlB puis “
CtrlB puis Q
Depuis une session tmux
:
CtrlB puis %
Depuis une session tmux
:
CtrlB puis ;
Depuis une session tmux
:
CtrlB puis O
Ou
Depuis une session tmux
:
CtrlB puis X
CtrlB puis {
CtrlB puis }
Depuis un terminal:
tmux kill-session nom_de_la_session
Pour connaître les autres commandes utilisables, voir les pages suivantes: