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.