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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn