Bg

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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.

Voir aussi

  • Screen — détacher une session entière (pas seulement un processus), s'y reconnecter plus tard
  • Kill — envoyer un signal à un job ou un processus, y compris pour terminer un job suspendu