Aller au contenu
Administration Linux medium

Lancer une commande en arrière-plan sous Linux

6 min de lecture

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.

  • 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 disown pour qu’elle survive à la fermeture
  • 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.
Fenêtre de terminal
sleep 60 &

Le shell affiche immédiatement :

[1] 1842
  • [1] : numéro de job (utilisé par jobs, fg, bg)
  • 1842 : PID du processus

Le prompt est restitué. La commande tourne en parallèle.

Fenêtre de terminal
# Vérifier qu'elle tourne bien
ps -p 1842 -o pid,stat,comm
PID STAT COMMAND
1842 S sleep

$! contient le PID de la dernière commande lancée en background :

Fenêtre de terminal
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.

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 :

Fenêtre de terminal
ma-commande-longue > sortie.log 2>&1 &
MYPID=$!
  • > sortie.log : redirige stdout vers le fichier
  • 2>&1 : redirige stderr vers le même fichier
  • & : place en background

Pour ajouter à un fichier de log existant :

Fenêtre de terminal
ma-commande >> /var/log/mon-script.log 2>&1 &

wait bloque le shell jusqu’à la fin du processus indiqué :

Fenêtre de terminal
sleep 2 &
PID=$!
echo "En attente de $PID..."
wait $PID
echo "Terminé avec le code retour : $?"
Fenêtre de terminal
# Lancer 3 opérations en parallèle
tache_a &
A=$!
tache_b &
B=$!
tache_c &
C=$!
# Attendre toutes les 3 avant de continuer
wait $A $B $C
echo "Toutes terminées"

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 :

Fenêtre de terminal
sleep 120 &
MYPID=$!
disown $MYPID
jobs # la tâche n'apparaît plus
ps -p $MYPID # mais le processus tourne encore
OptionEffet
disown $PIDRetire la tâche de jobs et l’immunise contre SIGHUP
disown -h $PIDL’immunise contre SIGHUP sans la retirer de jobs
disown -aDétache toutes les tâches

disown -h est utile si vous voulez encore pouvoir utiliser fg ou jobs sur la tâche.

Le pattern complet pour une tâche longue résistante à la déconnexion :

Fenêtre de terminal
commande > sortie.log 2>&1 &
disown $!

Ou en version plus lisible dans un script :

Fenêtre de terminal
ma-commande > /var/log/ma-commande.log 2>&1 &
PID=$!
disown $PID
echo "Tâche lancée, PID=$PID, sortie dans /var/log/ma-commande.log"
SymptômeCause probableSolution
La sortie du background s’affiche en plein milieu de votre promptPas de redirectionAjouter > sortie.log 2>&1 &
$! videPas de & ou la commande a été lancée autrementVérifier que la commande se termine par &
La tâche meurt à la déconnexion malgré &SIGHUP envoyé à la fermeture de sessionAjouter disown $PID après le lancement
wait $PID retourne immédiatementLe processus est déjà terminéNormal — vérifier son code retour avec echo $?
La tâche consomme 100% CPU en backgroundAucun throttling impliciteLancer avec nice -n 15 commande & pour baisser sa priorité
  • 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 $PID attend la fin d’une tâche spécifique.
  • disown $PID protège contre SIGHUP sans relancer la commande.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn