Objectifs
- Lancer une commande en arrière-plan pour ne pas bloquer le terminal.
- Gérer les “jobs” : lister, mettre au premier-plan (
fg) et en arrière-plan (bg). - Suspendre une tâche en cours avec
Ctrl+Z. - Lancer une commande qui survit à la fermeture du terminal avec
nohup.
Explications détaillées
Notions clés
Processus en Premier-plan vs Arrière-plan
- Premier-plan (Foreground) : C’est le comportement par défaut. Quand vous lancez une commande (
sleep 10), votre terminal est bloqué et attend qu’elle se termine. Vous ne pouvez rien taper d’autre. - Arrière-plan (Background) : Vous pouvez lancer une commande et récupérer immédiatement la main pour continuer à travailler. La commande s’exécute “derrière la scène”.
Lancer en arrière-plan : &
Pour lancer une commande en arrière-plan, il suffit d’ajouter un & à la fin.
longue_operation.sh &
Le shell affichera un numéro de job et un ID de processus (PID), puis vous rendra le prompt.
Les Jobs du Shell
Un job est une tâche que votre shell contrôle. Il peut s’agir d’un ou de plusieurs processus.
jobs: Affiche la liste des jobs en cours, gérés par votre shell. Chaque job a un numéro (%1,%2, etc.).fg %n(foreground) : Ramène le job numéronau premier-plan.bg %n(background) : Fait redémarrer un job suspendu en arrière-plan.
Suspendre et reprendre une tâche : Ctrl+Z
Pendant qu’une commande s’exécute au premier-plan, vous pouvez l’interrompre (la mettre en pause) en appuyant sur Ctrl+Z. Le shell affichera “Stopped” et vous rendra la main. Le job est maintenant suspendu. Vous pouvez le voir avec jobs.
Pour le relancer :
fg %n: Reprend au premier-plan.bg %n: Reprend en arrière-plan.
Survivre à la déconnexion : nohup et disown
Que se passe-t-il si vous fermez votre terminal (ou votre connexion SSH) ? Par défaut, tous les jobs que vous avez lancés (même en arrière-plan) sont tués.
nohup commande &:nohup(No Hang Up) est une commande qui lance une autre commande en la rendant insensible au signal de fermeture du terminal. Sa sortie est automatiquement redirigée vers un fichiernohup.out.disown %n: C’est une commande intégrée de Bash qui retire le jobnde la liste des jobs du shell. Une fois “désavoué”, le processus n’est plus lié au shell et ne sera pas tué à sa fermeture.
Syntaxe / Usages
# Lancer une longue compression en arrière-plan
tar -czf archive.tar.gz mon_gros_dossier/ &
# Voir les jobs en cours
jobs
# Ramener le job 1 au premier-plan
fg %1
# Lancer un script qui doit continuer même si on se déconnecte
nohup ./mon_long_script.sh &
# Lancer un job, puis le détacher du shell
ma_commande &
disown %1
Exemples
# 1. Jouer avec sleep
# Lance un 'sleep' de 5 minutes en arrière-plan
sleep 300 &
# Le shell affiche quelque chose comme [1] 12345
# [1] est le numéro du job, 12345 est le PID du processus.
# Vérifier les jobs
jobs
# -> [1]+ Running sleep 300 &
# Ramener le job au premier-plan (il va continuer à dormir en bloquant le terminal)
fg %1
# Maintenant, on peut l'arrêter avec Ctrl+C
# 2. Suspendre et reprendre
# Lancez une commande qui dure un peu, comme un ping
ping data.pm
# Pendant qu'il tourne, faites Ctrl+Z
# -> [1]+ Stopped ping data.pm
# Reprenez-le en arrière-plan
bg %1
# Le ping continue, mais vous avez la main. Vous pouvez voir les jobs.
jobs
# Ramenez-le au premier-plan pour l'arrêter
fg %1
# Ctrl+C
Bonnes pratiques
- Pour les vrais services ou les tâches de longue durée sur un serveur, préférez des outils plus robustes comme
systemd,tmuxouscreen. Ils offrent un bien meilleur contrôle, des logs propres et une gestion de la session plus fiable quenohup. - Quand vous lancez un script en arrière-plan, redirigez toujours sa sortie (
>et2>) vers un fichier de log. Sinon, les messages peuvent se mélanger à votre session ou être perdus../mon_script.sh > mon_script.log 2>&1 &
Pièges courants
- Oublier le
&: Lance la commande au premier-plan et bloque votre terminal. - Lancer en arrière-plan un programme interactif : Si la commande a besoin de poser une question (
Voulez-vous continuer ?), elle se mettra en pause en arrière-plan et attendra indéfiniment. - Fermer le terminal en pensant que
&suffit : Dans la plupart des configurations, fermer le shell tue tous les processus qu’il a lancés, même ceux en&. Il fautnohupoudisownpour les rendre persistants.
Exercices
-
Le dormeur :
- Lancez la commande
sleep 1000en arrière-plan. - Vérifiez son statut avec
jobs. - Trouvez son PID (Process ID) avec
pgrep sleep. - Arrêtez-le en utilisant la commande
killavec son numéro de job (ex:kill %1).
- Lancez la commande
-
La pause-reprise :
- Lancez une commande simple qui tourne en continu, comme
yes. - Suspendez-la avec
Ctrl+Z. - Vérifiez son statut avec
jobs. - Reprenez-la en arrière-plan avec
bg. - Arrêtez-la avec
kill.
- Lancez une commande simple qui tourne en continu, comme
-
Le script persistant (à faire avec prudence) :
- Créez un script
compteur.shqui écrit la date dans un fichiercompteur.logtoutes les 5 secondes (ex:while true; do date >> compteur.log; sleep 5; done). - Rendez-le exécutable.
- Lancez-le avec
nohup ./compteur.sh &. - Vérifiez que le fichier
nohup.outest créé (il peut être vide si le script n’a pas d’erreurs). - Vérifiez que le fichier
compteur.logse remplit. - Pour l’arrêter, trouvez son PID avec
pgrep compteur.shet utilisezkill.
- Créez un script