1.4. Modes d’exécution d’une commande

Deux modes d’exécution peuvent être distingués :

  1. l’exécution séquentielle

  2. l’exécution en arrière-plan.

1.4.1. Exécution séquentielle

Le mode d’exécution par défaut d’une commande est l’exécution séquentielle : le shell lit la commande entrée par l’utilisateur, l’analyse, la prétraite et si elle est syntaxiquement correcte, l’exécute.

Une fois l’exécution terminée, le shell effectue le même travail avec la commande suivante.

L’utilisateur doit donc attendre la fin de l’exécution de la commande précédente pour que la commande suivante puisse être exécutée : on dit que l’exécution est synchrone.

Si on tape la suite de commandes : sleep 5 ENTRÉE date ENTRÉEENTRÉE désigne la touche entrée, l’exécution de date débute après que le délai de 5 secondes se soit écoulé.

Pour lancer l’exécution séquentielle de plusieurs commandes sur la même ligne de commande, il suffit de les séparer par un caractère ;

$ cd /tmp ; pwd; echo bonjour; cd ; pwd
/tmp 			=> affichée par l’exécution de pwd
bonjour 		=> affichée par l’exécution de echo bonjour
/home/sanchis 		=> affichée par l’exécution de pwd
$

Pour terminer l’exécution d’une commande lancée en mode synchrone, on appuie simultanément sur les touches CTRL et C (notées control-C ou ^C).

En fait, la combinaison de touches appropriée pour arrêter l’exécution d’une commande en mode synchrone est indiquée par la valeur du champ intr lorsque la commande unix stty est lancée :

$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
. . .
$

Supposons que la commande unixcat soit lancée sans argument, son exécution semblera figée à un utilisateur qui débute dans l’apprentissage d’un système Unix. Il pourra utiliser la combinaison de touches mentionnée précédemment pour terminer l’exécution de cette commande.

$ cat
^C
$

1.4.2. Exécution en arrière-plan

L’exécution en arrière-plan permet à un utilisateur de lancer une commande et de récupérer immédiatement la main pour lancer « en parallèle » la commande suivante (parallélisme logique). On utilise le caractère & pour lancer une commande en arrière-plan.

Dans l’exemple ci-dessous, la commande sleep 5 (suspendre l’exécution pendant 5 secondes) est lancée en arrière-plan. Le système a affecté le numéro d’identification 696 (également appelé pid) au processus correspondant tandis que bash a affecté un numéro de travail (ou numéro de job) égal à 1 et affiché [1]. L’utilisateur peut, en parallèle, exécuter d’autres commandes (dans cet exemple, il s’agit de la commande unix ps). Lorsque la commande en arrière-plan se termine, le shell le signale à l'utilisateur après que ce dernier ait appuyé sur la touche entrée : c'est le comportement par défaut.

$ sleep 5 &
[1] 696
$ ps
  PID TTY      TIME  CMD
  683 pts/0 00:00:00 bash
  696 pts/0 00:00:00 sleep
  697 pts/0 00:00:00 ps
$ 		=> l’utilisateur a appuyé sur la touche entrée mais sleep n’était pas terminée
$ 		=> l’utilisateur a appuyé sur la touche entrée et sleep était terminée
[1]+ Fini 		sleep 5
$

Toutefois, il est possible d'être informé dès que la commande en arrière-plan s'est terminée. Il suffit d'exécuter la commande set -b.

$ set -b
$
$ sleep 5 &
[1] 1385
$ ps
  PID TTY          TIME CMD
 1385 pts/16   00:00:00 sleep
 1441 pts/16   00:00:00 ps
17773 pts/16   00:00:00 bash
$ [1]+  Fini        sleep 5	=> affichage dès la terminaison de la commande
  	$							  
$ set +b 	=> restitue le comportement par défaut
$

Ainsi, outre la gestion des processus spécifique à Unix, bash introduit un niveau supplémentaire de contrôle de processus. En effet, bash permet de stopper, reprendre, mettre en arrière-plan un processus, ce qui nécessite une identification supplémentaire (numéro de job) non fournie par le système d'exploitation mais par bash.

L’exécution en arrière-plan est souvent utilisée lorsqu’une commande est gourmande en temps CPU (ex : longue compilation d’un programme).