Aller au contenu
Administration Linux medium

Jobs et contrôle des tâches dans le shell

8 min de lecture

Une tâche qui bloque votre terminal n’est pas une fatalité. Ctrl+Z la suspend, bg la relance en arrière-plan, fg la ramène devant vous. Le contrôle des tâches est le mécanisme natif du shell pour jongler entre plusieurs processus sans ouvrir de nouveau terminal.

  • Suspendre une tâche en cours avec Ctrl+Z
  • Lister les tâches actives avec jobs -l
  • Passer une tâche en arrière-plan avec bg
  • Ramener une tâche au premier plan avec fg
  • Référencer une tâche par son numéro avec %n
  • Tuer une tâche avec kill %n
  • Détacher définitivement une tâche avec disown

Cette compétence est utile dès qu’une commande prend du temps et bloque votre prompt :

  • une compilation ou une copie longue,
  • un éditeur ouvert que vous voulez mettre de côté,
  • un processus que vous avez lancé en foreground par erreur,
  • une tâche que vous voulez survivre à la fermeture du terminal.
Fenêtre de terminal
sleep 60 &

L’opérateur & place le processus en background dès le lancement. Le shell affiche le numéro de job et le PID, puis rend le prompt immédiatement :

[1] 1842

[1] est le numéro de tâche (job number). 1842 est le PID.

Fenêtre de terminal
# Capturer le PID de la dernière tâche lancée en background
sleep 60 &
MYPID=$!
echo "PID de la tâche : $MYPID"
Fenêtre de terminal
jobs -l
[1]+ 2075842 Running sleep 60 &
[2]- 2075843 Stopped vim fichier.txt

Colonnes :

ÉlémentSignification
[1]Numéro de tâche
+Tâche courante (celle que fg reprend par défaut)
-Tâche précédente
Running / StoppedÉtat
sleep 60 &Commande

Pendant qu’une commande tourne en foreground, appuyez sur Ctrl+Z :

vim fichier.txt
^Z
[1]+ Stopped vim fichier.txt

Le processus est suspendu (état T) — il n’utilise plus le CPU mais reste en mémoire. Le prompt est restitué.

Fenêtre de terminal
bg %1

La tâche suspendue [1] reprend son exécution en arrière-plan. Vous pouvez aussi utiliser bg sans argument pour reprendre la tâche courante (marquée +).

Fenêtre de terminal
# Suspendre puis reprendre en background
sleep 60
^Z
bg
Fenêtre de terminal
fg %1

La tâche [1] reprend le foreground — votre terminal est à nouveau bloqué tant qu’elle n’est pas terminée.

Fenêtre de terminal
fg # reprend la tâche courante (+)
fg %2 # reprend la tâche numéro 2

En plus de %n, vous pouvez référencer une tâche par le début de son nom :

Fenêtre de terminal
fg %vim # reprend la tâche dont la commande commence par "vim"
kill %sleep # tue la tâche dont la commande commence par "sleep"
Fenêtre de terminal
kill %1 # envoie SIGTERM à la tâche 1
kill -9 %2 # envoie SIGKILL à la tâche 2

Nettoyage de toutes les tâches :

Fenêtre de terminal
kill $(jobs -p)

jobs -p liste uniquement les PIDs — ce qui permet de les passer à kill en une seule ligne.

Fenêtre de terminal
sleep 3 &
MYPID=$!
echo "En attente..."
wait $MYPID
echo "Terminé avec le code : $?"

wait bloque le shell jusqu’à la fin du processus désigné. Sans argument, il attend toutes les tâches background actives.

disown retire une tâche de la table des jobs. Elle survit à la fermeture du shell mais ne reçoit plus SIGHUP.

Fenêtre de terminal
sleep 120 &
disown $!
jobs # la tâche n'apparaît plus
ps -p $PID # mais le processus est toujours en vie

Variantes utiles :

Fenêtre de terminal
disown -h $! # marque la tâche "immune au SIGHUP" sans la retirer de jobs
disown -a # détache toutes les tâches
ActionRaccourci / Commande
Suspendre (foreground → stopped)Ctrl+Z
Reprendre en arrière-planbg %n
Ramener au premier planfg %n
Lancer directement en backgroundcommande &
Capturer le PID de la dernière tâche background$!
Lister les tâchesjobs -l
Tuer par numéro de jobkill %n
Attendre la finwait $PID
Détacher du shelldisown $PID
SymptômeCause probableSolution
bg sans effet sur une tâcheCertains programmes ignorent SIGCONT (GUI, ncurses)Fermer proprement avec kill %n, puis relancer avec &
fg %2 répond “no such job”Numérotation différente selon les shellsVérifier avec jobs -l et utiliser le bon numéro
La tâche disparaît à la déconnexion malgré &SIGHUP envoyé à la fermeture de sessionUtiliser disown -h ou nohup
kill %1 ne termine pas la tâcheProcessus en état D ou ignore SIGTERMkill -9 %1 ; si état D, diagnostiquer l’I/O bloqué
$! vide dans le scriptLa dernière commande n’a pas été lancée avec &Ajouter & à la fin de la commande
  • & place un processus en arrière-plan au lancement ; Ctrl+Z suspend un processus en cours.
  • jobs -l liste les tâches avec leur numéro et leur PID.
  • bg %n reprend, fg %n ramène, kill %n tue — toujours par numéro de job.
  • $! contient le PID de la dernière tâche lancée en arrière-plan.
  • disown détache une tâche déjà lancée pour qu’elle survive à la fermeture du shell.

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