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.
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.
Avant de parler des commandes, voici les signaux les plus importants que vous pouvez envoyer aux processus :
| Signal | Numéro | Description |
|---|---|---|
SIGTERM | 15 | Demande d'arrêt normale (par défaut) |
SIGINT | 2 | Interruption (comme Ctrl+C) |
SIGKILL | 9 | Arrêt forcé immédiat |
SIGSTOP | 19 | Suspension du processus |
SIGCONT | 18 | Reprise du processus suspendu |
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 interromprePour 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 100La commande jobs affiche tous les jobs du terminal actuel :
# Syntaxe
jobs [options]
# Exemple
jobs -l # Affiche aussi le PID| Option | Description |
|---|---|
-l | Affiche les PID en plus des job IDs |
-p | Affiche uniquement les PID |
-r | Affiche uniquement les jobs en cours d'exécution |
-s | Affiche uniquement les jobs suspendus |
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 2bg (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-plankill 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 processusPour 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 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èreLa commande wait attend qu'un job spécifique se termine :
# Attendre le job 1
wait %1
# Attendre tous les jobs en arrière-plan
waitnohup 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 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 -atrap 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 60Pour 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| Signal | Usage dans trap |
|---|---|
EXIT | Exécuté à la fin du script |
RETURN | Exécuté quand une fonction se termine |
ERR | Exécuté quand une commande échoue |
DEBUG | Exécuté après chaque commande |
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!"| Raccourci | Description |
|---|---|
Ctrl+C | Interrompre le processus au premier plan |
Ctrl+Z | Suspendre le processus actuel |
Ctrl+D | Fin d'entrée (EOF) |
Ctrl+L | Effacer l'écran |
Ctrl+S | Suspendre l'affichage |
Ctrl+Q | Reprendre l'affichage |
Ctrl+C interrompt un processus au premier planCtrl+Z suspend un processus et le met en pausejobs liste les jobs actifs du terminalfg ramène un job au premier planbg reprend un job suspendu en arrière-plankill envoie un signal à un processus (par PID)killall tue tous les processus d'une commandenohup protège contre la déconnexiondisown détache un job du shelltrap intercepte les signaux dans les scripts