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 tournent 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.
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
$
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
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
Télécharger le programme progress_bar
sur votre machine en utilisant la commande wget
.
Exécuter la commande screen
screen
Dans le processus screen, exécuter les commandes suivantes:
. progress_bar
progress_bar 120
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
)