Retour au cours

processus jobs

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éro n au 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 fichier nohup.out.
  • disown %n : C’est une commande intégrée de Bash qui retire le job n de 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, tmux ou screen. Ils offrent un bien meilleur contrôle, des logs propres et une gestion de la session plus fiable que nohup.
  • Quand vous lancez un script en arrière-plan, redirigez toujours sa sortie (> et 2>) 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 faut nohup ou disown pour les rendre persistants.

Exercices

  1. Le dormeur :

    • Lancez la commande sleep 1000 en arrière-plan.
    • Vérifiez son statut avec jobs.
    • Trouvez son PID (Process ID) avec pgrep sleep.
    • Arrêtez-le en utilisant la commande kill avec son numéro de job (ex: kill %1).
  2. 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.
  3. Le script persistant (à faire avec prudence) :

    • Créez un script compteur.sh qui écrit la date dans un fichier compteur.log toutes 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.out est créé (il peut être vide si le script n’a pas d’erreurs).
    • Vérifiez que le fichier compteur.log se remplit.
    • Pour l’arrêter, trouvez son PID avec pgrep compteur.sh et utilisez kill.