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 (job control) est le mécanisme natif du shell pour jongler entre plusieurs processus sans ouvrir de nouveau terminal. Les comportements décrits ici ont été vérifiés avec Bash 5.2 sur Debian 13, Ubuntu 24.04 et AlmaLinux 10, dans un pseudo-terminal.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »Cette compétence sert dès qu'une commande prend du temps et bloque votre prompt. Une tâche (job) est une commande lancée depuis votre shell, suivie par lui tant que la session dure :
- 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.
Lancer un processus en arrière-plan
Section intitulée « Lancer un processus en arrière-plan »L'opérateur & place le processus en background (arrière-plan) dès le lancement. Le shell affiche le numéro de job et le PID, puis rend le prompt immédiatement :
sleep 60 &[1] 1842[1] est le numéro de tâche (job number), local à votre shell : c'est lui qu'attendent fg, bg et kill %1. 1842 est le PID, l'identifiant du processus pour tout le système. La variable spéciale $! contient le PID de la dernière tâche lancée en arrière-plan : capturez-la aussitôt, le prochain & l'écrasera.
# Capturer le PID de la dernière tâche lancée en backgroundsleep 60 &MYPID=$!echo "PID de la tâche : $MYPID"Lister les tâches : jobs
Section intitulée « Lister les tâches : jobs »jobs liste les tâches de la session courante seulement, avec leur
numéro et leur état ; l'option -l ajoute le PID. Dans l'exemple ci-dessous,
sleep 60 tourne en arrière-plan et vim a été suspendu :
jobs -l[1]- 2075842 Running sleep 60 &[2]+ 2075843 Stopped vim fichier.txtLa tâche courante (+) est celle que fg et bg visent sans argument :
la dernière suspendue ou lancée en arrière-plan, et Bash donne la priorité à
une tâche suspendue. Mesuré avec Bash 5.2 : un sleep 200 suspendu reste
marqué + même quand un sleep 201 & est lancé après lui. Colonnes :
| Élément | Signification |
|---|---|
[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 |
Suspendre une tâche : Ctrl+Z
Section intitulée « Suspendre une tâche : Ctrl+Z »Pendant qu'une commande tourne au premier plan (foreground), Ctrl+Z lui envoie le signal de suspension SIGTSTP et rend le prompt :
vim fichier.txt^Z[1]+ Stopped vim fichier.txtLe processus est suspendu (état T dans ps) : il n'utilise plus le CPU mais reste en mémoire, prêt à reprendre exactement où il s'était arrêté. C'est ce qui rend Ctrl+Z pratique pour mettre un éditeur de côté le temps de lancer une commande.
Reprendre en arrière-plan : bg
Section intitulée « Reprendre en arrière-plan : bg »bg (background) fait reprendre une tâche suspendue en arrière-plan : elle continue son travail, et vous gardez le prompt. C'est le rattrapage d'une commande longue lancée sans & par erreur, sans perdre ce qui a déjà été fait.
bg %1La tâche suspendue [1] reprend son exécution en arrière-plan. Sans argument, bg reprend la tâche courante (marquée +) :
# Suspendre puis reprendre en backgroundsleep 60^ZbgUne limite, mesurée avec cat & : un programme qui lit le terminal ne peut pas tourner en arrière-plan. Il reçoit le signal SIGTTIN et s'arrête de nouveau, et jobs l'affiche alors en Stopped (tty input).
Ramener au premier plan : fg
Section intitulée « Ramener au premier plan : fg »fg (foreground) redonne le premier plan à une tâche : votre terminal est à nouveau bloqué tant qu'elle n'est pas terminée, mais vous retrouvez son interactivité, indispensable pour un éditeur mis de côté.
fg %1fg # reprend la tâche courante (+)fg %2 # reprend la tâche numéro 2Une tâche qui n'existe plus répond fg: %2: no such job : elle s'est terminée entre-temps, ou le numéro est faux.
Référencer les tâches par leur nom
Section intitulée « Référencer les tâches par leur nom »En plus de %n, vous pouvez désigner une tâche par le début de sa commande, ce qui évite de consulter jobs avant chaque action. La référence doit rester non ambiguë : si deux tâches commencent par le même mot, Bash refuse d'en choisir une.
fg %vim # reprend la tâche dont la commande commence par "vim"kill %sleep # tue la tâche dont la commande commence par "sleep"Tuer une tâche par son numéro
Section intitulée « Tuer une tâche par son numéro »kill accepte un numéro de job précédé de % aussi bien qu'un PID. Sans option, il envoie SIGTERM, la demande d'arrêt propre ; -9 envoie SIGKILL, que le programme ne peut pas intercepter.
kill %1 # envoie SIGTERM à la tâche 1kill -9 %2 # envoie SIGKILL à la tâche 2Pour nettoyer toutes les tâches de la session d'un coup, jobs -p fournit uniquement leurs PID, que kill reçoit en une seule ligne :
kill $(jobs -p)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 désigné, puis place son code de sortie dans $?. C'est la brique de synchronisation des scripts qui lancent plusieurs traitements en parallèle.
sleep 3 &MYPID=$!echo "En attente..."wait $MYPIDecho "Terminé avec le code : $?"Sans argument, wait attend toutes les tâches background actives du shell.
Détacher une tâche du shell : disown
Section intitulée « Détacher une tâche du shell : disown »disown retire une tâche de la table des jobs : le shell ne lui relaiera plus
le SIGHUP qu'il reçoit à la déconnexion, et elle survit donc à la fermeture
de la session. Il accepte un numéro de job (%1) comme un PID (vérifié).
sleep 120 &MYPID=$!disown $MYPIDjobs # la tâche n'apparaît plusps -p $MYPID # mais le processus est toujours en vieUn simple exit ne tue d'ailleurs pas une tâche en cours d'exécution en arrière-plan :
l'option huponexit de Bash est désactivée par défaut (vérifié avec
shopt huponexit). Le danger vient du SIGHUP que le shell reçoit quand la
connexion SSH ou le terminal se ferment : il le relaie alors à ses tâches, et
mesuré sur Debian 13 et AlmaLinux 10, un sleep lancé avec & meurt avec lui.
Deux variantes couvrent les autres besoins : -h protège la tâche sans la retirer de la table, ce qui laisse fg possible, et -a traite toutes les tâches d'un coup.
disown -h $! # protège la tâche du SIGHUP sans la retirer de jobsdisown -a # détache toutes les tâchesRécapitulatif des raccourcis
Section intitulée « Récapitulatif des raccourcis »Ce tableau rassemble les gestes de la page dans l'ordre où ils servent : le lancement, la suspension, la reprise, puis le détachement. Gardez-le sous la main lors de vos premières sessions.
| Action | Raccourci / Commande |
|---|---|
| Suspendre (foreground → stopped) | Ctrl+Z |
| Reprendre en arrière-plan | bg %n |
| Ramener au premier plan | fg %n |
| Lancer directement en background | commande & |
| Capturer le PID de la dernière tâche background | $! |
| Lister les tâches | jobs -l |
| Tuer par numéro de job | kill %n |
| Attendre la fin | wait $PID |
| Détacher du shell | disown $PID |
Dépannage
Section intitulée « Dépannage »Les symptômes ci-dessous viennent presque tous d'une confusion entre les trois états d'une tâche (premier plan, arrière-plan, suspendue) ou entre numéro de job et PID. Commencez toujours par jobs -l, qui montre les deux.
| Symptôme | Cause probable | Solution |
|---|---|---|
Après bg, la tâche repasse en Stopped (tty input) | Le programme lit le terminal : en arrière-plan, il reçoit SIGTTIN et s'arrête (mesuré avec cat &) | La ramener avec fg, ou la relancer avec une entrée redirigée (< /dev/null) |
fg %2 répond fg: %2: no such job | La tâche est terminée, ou le numéro est faux | Vérifier avec jobs -l et utiliser le bon numéro |
La tâche disparaît à la déconnexion malgré & | SIGHUP relayé par le shell à la fermeture de session | Utiliser disown -h ou nohup |
kill %1 ne termine pas la tâche | Processus en état D ou ignore SIGTERM | kill -9 %1 ; si état D, diagnostiquer l'I/O bloqué |
$! vide dans le script | Aucune commande n'a encore été lancée avec & | Ajouter & à la fin de la commande |
À retenir
Section intitulée « À retenir »&place un processus en arrière-plan au lancement ;Ctrl+Zsuspend un processus en cours.jobs -lliste les tâches avec leur numéro et leur PID ;+marque la tâche courante, de préférence une tâche suspendue.bg %nreprend,fg %nramène,kill %ntue, toujours par numéro de job.$!contient le PID de la dernière tâche lancée en arrière-plan.- Un
exitne tue pas les tâches qui tournent ; le SIGHUP de la déconnexion, si. disowndétache une tâche déjà lancée pour qu'elle survive à la fermeture de la session.
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.
Points faibles
Aucun sujet sous le seuil de réussite.
À faire ensuite
Des indices pour retenter votre chance ?
Continuer le cours : Lancer une commande en arrière-plan
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications