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 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