← Sommaire SkyLinux

Leçon 72 : Jobs et processus en arrière-plan

Introduction

Quand vous lancez une commande dans le terminal, elle s'exécute au premier plan (foreground) par défaut. Mais Linux vous permet de gérer plusieurs tâches simultanément : envoyer un processus en arrière-plan, le ramener au premier plan, ou encore l'arrêter proprement. C'est ce que nous allons voir dans cette leçon.

Comprendre les jobs (tâches)

Un job est une commande qui s'exécute dans votre terminal. shell maintient une liste des jobs actifs. Chaque job a un numéro (job ID) que vous pouvez utiliser pour le manipuler.

Les signaux de base

Avant de parler des commandes, voici les signaux les plus importants que vous pouvez envoyer aux processus :

SignalNuméroDescription
SIGTERM15Demande d'arrêt normale (par défaut)
SIGINT2Interruption (comme Ctrl+C)
SIGKILL9Arrêt forcé immédiat
SIGSTOP19Suspension du processus
SIGCONT18Reprise du processus suspendu

Ctrl+C — Interrompre un processus

Pour envoyer un signal d'interruption à un processus en cours d'exécution au premier plan :

# Exemple : lancer une commande longue, puis l'interrompre sleep 100 # Appuyez sur Ctrl+C pour interrompre

Ctrl+Z — Suspendre un processus

Pour suspendre un processus et le mettre en arrière-plan suspendu :

# Lancer une commande sleep 100 # Appuyez sur Ctrl+Z pour suspendre # Vous verrez quelque chose comme : # [1]+ Stopped sleep 100

jobs — Lister les jobs actifs

La commande jobs affiche tous les jobs du terminal actuel :

# Syntaxe jobs [options] # Exemple jobs -l # Affiche aussi le PID
OptionDescription
-lAffiche les PID en plus des job IDs
-pAffiche uniquement les PID
-rAffiche uniquement les jobs en cours d'exécution
-sAffiche uniquement les jobs suspendus

fg — Remettre un job au premier plan

fg (foreground) ramène un job suspendu ou en arrière-plan au premier plan :

# Syntaxe fg [%job_id] # Exemples fg # Remet le dernier job suspendu fg %1 # Remet le job 1 fg %2 # Remet le job 2

bg — Reprendre un job en arrière-plan

bg (background) reprend un job suspendu et le fait tourner en arrière-plan :

# Syntaxe bg [%job_id] # Exemple pratique # 1. Lancer une commande sleep 100 # 2. Suspendre avec Ctrl+Z # [1]+ Stopped sleep 100 # 3. Reprendre en arrière-plan bg %1 # [1]+ sleep 100 & # La commande tourne maintenant en arrière-plan

kill — Envoyer des signaux aux processus

kill envoie un signal à un processus. Par défaut, il envoie SIGTERM (demande d'arrêt) :

# Syntaxe kill [signal] PID # Exemples kill 1234 # Demande d'arrêt normal au processus 1234 kill -15 1234 # Identique au-dessus (SIGTERM) kill -9 1234 # Arrêt forcé (SIGKILL) kill -SIGSTOP 1234 # Suspendre le processus kill -SIGCONT 1234 # Reprendre le processus

Pour tuer tous les processus d'une commande spécifique :

# Utiliser pkill pour tuer par nom pkill sleep # Tuer tous les processus "sleep" pkill -f "python" # Tuer tous les processus contenant "python"

killall — Tuer par nom de commande

killall tue tous les processus correspondant à un nom :

# Syntaxe killall [signal] nom_processus # Exemples killall firefox # Tuer tous les Firefox killall -9 chromium # Forcer l'arrêt de Chromium killall -r "chrome.*" # Utiliser une expression régulière

wait — Attendre la fin d'un job

La commande wait attend qu'un job spécifique se termine :

# Attendre le job 1 wait %1 # Attendre tous les jobs en arrière-plan wait

nohup — Protéger contre la déconnexion

nohup permet à une commande de continuer après déconnexion du terminal :

# Lancer une commande immune à la déconnexion nohup ./script.sh & # La sortie est redirigée vers nohup.out par défaut # Vous pouvez aussi spécifier une sortie : nohup ./script.sh > output.log &

disown — Détacher un job du shell

disown retire un job de la table des jobs, le protégeant contre les effets de la déconnexion :

# Détacher le dernier job disown # Détacher un job spécifique disown %1 # Détacher tous les jobs disown -a

trap — Intercepter les signaux dans les scripts

trap permet de définir des actions à exécuter quand un signal est reçu (très utile dans les scripts) :

#!/bin/bash trap "echo 'Interruption détectée!'" SIGINT SIGTERM echo "Script en cours... Ctrl+C pour tester" sleep 60

Pour nettoyer avant de quitter :

#!/bin/bash cleanup() { echo "Nettoyage en cours..." rm -f /tmp/tempfile exit 0 } trap cleanup EXIT INT TERM echo "Script en cours..." sleep 60

Signaux spéciaux dans les scripts

SignalUsage dans trap
EXITExécuté à la fin du script
RETURNExécuté quand une fonction se termine
ERRExécuté quand une commande échoue
DEBUGExécuté après chaque commande

Exemple pratique : gestionnaire de tâches

Voici un script qui gère plusieurs tâches en arrière-plan :

#!/bin/bash # Lancer 3 tâches en arrière-plan echo "Démarrage des tâches..." ./tache1.sh & PID1=$! ./tache2.sh & PID2=$! ./tache3.sh & PID3=$! echo "Tâches lancées: $PID1, $PID2, $PID3" echo "Tapez 'jobs' pour voir l'état" # Attendre tous les jobs wait echo "Toutes les tâches sont terminées!"

Raccourcis clavier utiles

RaccourciDescription
Ctrl+CInterrompre le processus au premier plan
Ctrl+ZSuspendre le processus actuel
Ctrl+DFin d'entrée (EOF)
Ctrl+LEffacer l'écran
Ctrl+SSuspendre l'affichage
Ctrl+QReprendre l'affichage

Résumé