Initiation aux jobs bash

Bash permet d'exécuter des processus en tâche de fond (arrière plan), le fameux &. En mode interactif, toute commande lancée avec & à la fin va la faire s'exécuter en arrière plan. La fin de la commande ou du processus ainsi lancé est rapportée par le message:

$ sleep 1 &
[1] 8269
$
[1]+  Fini                    sleep 1
$

Cela signifie que la commande sleep 1 s'est terminée avec le code retour 0. En effet, si un des processus fils retournait autre chose que ce code, on aurait alors le message:

$ (sleep 1 && exit 2) &
[1] 8666
$ 
[1]+  Termine 2               ( sleep 1 && exit 2 )
Les entrées/sorties

Quand un processus en lancé en arrière plan, /dev/stdout et /dev/stderr, les canaux de sorties et d'erreurs, sont hérités du processus père. Voici un exemple qui démontre l'héritage de la sortie standard:


$ ( echo coucou ) &
[1] 9414
coucou

En ce qui concerne l'entrée standard, si une commande attend sur celle-ci, bash suspendra la commande. Il faudra alors remettre la commande en avant plan (fg), ce qui l'autorisera à lire sur l'entrée standard:

$ ( read p ) &
[1] 9434
$ 
[1]+  Stoppé                 ( read p )
$ fg
( read p )
coucou
$
Mettre en arrière plan, une commande lancée en avant plan

Avec bash, il est possible de mettre une commande en arrière plan à posteriori. Il faut, tout d'abord, envoyer le signal STOP via la séquence de touches CTRL + Z. Cela aura pour effet de stopper la commande en cours et de rendre la main pour exécuter une autre commande. Il est alors possible de la passer en arrière plan avec bg (background):

$ sleep 100
^Z
[1]+  Stoppé                 sleep 100
$ bg
[1]+ sleep 100 &
$  jobs -l
[1]+ 27482 En cours d'exécution   sleep 100 &

A noter qu'il est possible de revenir à l'exécution de notre première commande à tout moment avec fg (foreground).

Lister les jobs en cours d'exécution

La commande _jobs_ permet d'avoir la liste des jobs en cours:

$ jobs -l -p
Tuer un processus fils

Bash permet d'envoyer des signaux (et notamment _SIGTERM_ et _SIGKILL_) en utilisant les raccourcis _%1_ à _%n_. %1 signifiant le premier job mis en arrière plan. En utilisant la commande interne _kill_ de bash, on peut ainsi tuer les processus fils:

$ sleep 100 &
[1] 28013
$ kill %1
$ 
[1]+  Complété              sleep 100
$

Vous avez d'autres trucs et astuces sur les jobs bash?

Ajoutez-les en commentaire!