Ajouter & à la fin d'une commande suffit pour la lancer en arrière-plan. Le shell rend le prompt immédiatement et le processus continue de tourner. Associé à une redirection et à disown, c'est la base pour lancer des tâches longues sans bloquer votre session.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lancer n'importe quelle commande en background avec
& - Récupérer le PID de la tâche avec
$! - Rediriger correctement stdout et stderr d'un processus background
- Attendre la fin d'une ou plusieurs tâches avec
wait - Détacher une tâche du shell avec
disownpour qu'elle survive à la fermeture
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »- Vous lancez une sauvegarde, une compilation ou un téléchargement et vous voulez continuer à utiliser le terminal.
- Vous voulez paralléliser plusieurs opérations dans un script.
- Vous avez lancé une commande en foreground et vous voulez la rendre indépendante de votre session SSH.
Lancer une commande en arrière-plan
Section intitulée « Lancer une commande en arrière-plan »sleep 60 &Le shell affiche immédiatement :
[1] 1842[1]: numéro de job (utilisé parjobs,fg,bg)1842: PID du processus
Le prompt est restitué. La commande tourne en parallèle.
# Vérifier qu'elle tourne bienps -p 1842 -o pid,stat,comm PID STAT COMMAND 1842 S sleepCapturer le PID avec $!
Section intitulée « Capturer le PID avec $! »$! contient le PID de la dernière commande lancée en background :
sleep 30 &MYPID=$!echo "La tâche tourne avec le PID : $MYPID"Capturez $! immédiatement après le lancement, sa valeur change à chaque nouveau background.
Rediriger la sortie d'un processus background
Section intitulée « Rediriger la sortie d'un processus background »Sans redirection, stdout et stderr s'affichent dans votre terminal de manière asynchrone, ce qui mélange les sorties. Redirigez toujours les processus background qui produisent de la sortie :
ma-commande-longue > sortie.log 2>&1 &MYPID=$!> sortie.log: redirige stdout vers le fichier2>&1: redirige stderr vers le même fichier&: place en background
Pour ajouter à un fichier de log existant :
ma-commande >> /var/log/mon-script.log 2>&1 &Attendre la fin d'une tâche : wait
Section intitulée « Attendre la fin d'une tâche : wait »wait bloque le shell jusqu'à la fin du processus indiqué :
sleep 2 &PID=$!echo "En attente de $PID..."wait $PIDecho "Terminé avec le code retour : $?"Paralléliser et attendre
Section intitulée « Paralléliser et attendre »# Lancer 3 opérations en parallèletache_a &A=$!tache_b &B=$!tache_c &C=$!
# Attendre toutes les 3 avant de continuerwait $A $B $Cecho "Toutes terminées"Détacher une tâche du shell : disown
Section intitulée « Détacher une tâche du shell : disown »Par défaut, quand votre shell reçoit SIGHUP (fermeture de session), il transmet ce signal à tous ses processus background, ce qui les tue.
disown retire une tâche de la liste des jobs du shell. Elle ne reçoit plus SIGHUP :
sleep 120 &MYPID=$!disown $MYPID
jobs # la tâche n'apparaît plusps -p $MYPID # mais le processus tourne encoreVariantes de disown
Section intitulée « Variantes de disown »| Option | Effet |
|---|---|
disown $PID | Retire la tâche de jobs et l'immunise contre SIGHUP |
disown -h $PID | L'immunise contre SIGHUP sans la retirer de jobs |
disown -a | Détache toutes les tâches |
disown -h est utile si vous voulez encore pouvoir utiliser fg ou jobs sur la tâche.
Lancement complet en une ligne
Section intitulée « Lancement complet en une ligne »Le pattern complet pour une tâche longue résistante à la déconnexion :
commande > sortie.log 2>&1 &disown $!Ou en version plus lisible dans un script :
ma-commande > /var/log/ma-commande.log 2>&1 &PID=$!disown $PIDecho "Tâche lancée, PID=$PID, sortie dans /var/log/ma-commande.log"Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| La sortie du background s'affiche en plein milieu de votre prompt | Pas de redirection | Ajouter > sortie.log 2>&1 & |
$! vide | Pas de & ou la commande a été lancée autrement | Vérifier que la commande se termine par & |
La tâche meurt à la déconnexion malgré & | SIGHUP envoyé à la fermeture de session | Ajouter disown $PID après le lancement |
wait $PID retourne immédiatement | Le processus est déjà terminé | Normal, vérifier son code retour avec echo $? |
| La tâche consomme 100% CPU en background | Aucun throttling implicite | Lancer avec nice -n 15 commande & pour baisser sa priorité |
À retenir
Section intitulée « À retenir »commande &lance en background et rend le prompt immédiatement.$!contient le PID de la dernière tâche background, capturez-le tout de suite.- Redirigez toujours stdout et stderr :
commande > out.log 2>&1 &. wait $PIDattend la fin d'une tâche spécifique.disown $PIDprotège contre SIGHUP sans relancer la commande.