Bg
| Fiche express | |
|---|---|
| Domaine | Contrôle de jobs du shell (job control) |
| Commandes | bg, fg, jobs, Ctrl+Z, nohup, disown
|
| Contexte | Bash/sh interactif — suspendre, basculer ou détacher un processus lancé depuis un terminal |
| Voir aussi | Screen, Kill |
Le contrôle de jobs (job control) permet de suspendre un processus lancé au premier plan, de le faire repasser en arrière-plan ou de le ramener au premier plan, sans le tuer — le tout piloté depuis le même shell interactif. C'est un mécanisme différent de nohup/&, qui sert à détacher un processus du terminal pour qu'il survive à la déconnexion.
Suspendre un processus au premier plan : Ctrl+Z
Depuis le terminal où tourne une commande au premier plan, Ctrl+Z l'arrête (état stopped, pas tué) et rend la main immédiatement au shell.
top
# Ctrl+Z
[1]+ Stopped top
$
Le processus reste en mémoire, suspendu, jusqu'à ce qu'on le reprenne avec bg ou fg — ou qu'on le termine avec kill (voir Kill).
Reprendre en arrière-plan : bg
bg reprend l'exécution d'un job suspendu, mais en arrière-plan : le shell redevient utilisable tout de suite pour taper d'autres commandes.
bg # reprend le job courant (celui marqué "+" dans jobs)
bg %2 # reprend spécifiquement le job numéro 2
Le processus continue de tourner tant que le shell qui l'a lancé reste ouvert — fermer le terminal ou se déconnecter l'interrompt (voir la section nohup ci-dessous pour l'éviter).
Reprendre au premier plan : fg
fg ramène un job (suspendu ou déjà en arrière-plan) au premier plan, avec le contrôle du terminal (Ctrl+C, Ctrl+Z redeviennent actifs dessus).
fg # ramène le job courant au premier plan
fg %2 # ramène spécifiquement le job numéro 2
Lister les jobs en cours : jobs
jobs affiche les jobs du shell courant (suspendus ou en arrière-plan), avec leur numéro et leur état.
jobs # liste les jobs, avec leur numéro et leur état (Running/Stopped)
jobs -l # idem, en affichant en plus le PID de chaque job
Le job marqué + est le job courant (celui que bg/fg sans argument cible par défaut), celui marqué - est le précédent. Le numéro affiché entre crochets (%1, %2...) sert à cibler un job précis avec bg, fg ou kill.
Survivre à la déconnexion : nohup et &
bg/fg/jobs ne concernent que le shell courant : fermer le terminal ou se déconnecter (SSH compris) envoie un signal SIGHUP qui termine tous les jobs de la session, arrière-plan compris. Pour lancer un processus qui continue à tourner après la déconnexion, il faut deux choses distinctes : & à la fin de la commande pour la lancer directement en arrière-plan, et nohup devant pour qu'elle ignore SIGHUP.
nohup top & # lance top en arrière-plan, insensible au SIGHUP de déconnexion
⚠️ && n'a rien à voir avec & : && enchaîne deux commandes (la seconde ne s'exécute que si la première réussit), il ne détache aucun processus. nohup top && autre_commande lance top au premier plan et attend qu'il se termine avant de lancer autre_commande — l'exact contraire de l'effet recherché. Seul & (simple) place une commande en arrière-plan.
Par défaut, nohup redirige la sortie standard et l'erreur standard vers un fichier nohup.out (dans le répertoire courant) si le terminal n'est plus disponible pour les afficher :
nohup ./mon_script.sh > sortie.log 2>&1 & # rediriger explicitement plutôt que nohup.out
Détacher un job déjà lancé : disown
Si une commande a déjà été lancée en arrière-plan avec & (sans nohup), disown permet de la détacher après coup de la table des jobs du shell, pour qu'elle survive elle aussi à la déconnexion.
longue_commande &
disown # détache le dernier job lancé
disown %2 # détache spécifiquement le job numéro 2
disown -a # détache tous les jobs
Contrairement à nohup, disown ne bloque pas SIGHUP — il retire seulement le job du suivi du shell, ce qui évite que le shell ne lui envoie explicitement un signal à la fermeture. Un processus qui écrit encore sur le terminal peut malgré tout être interrompu si le terminal disparaît ; pour un détachement robuste, préférer nohup (ou screen/tmux, voir Screen) posé dès le lancement.