Quand vous lancez une commande dans un terminal, elle s'arrête si vous fermez ce terminal. nohup (no hangup) permet de lancer des processus qui continuent à tourner même après la fermeture du terminal. C'est indispensable pour les serveur, les scripts longs, ou toute tâche qui doit survivre à une déconnexion.
Sous Linux, quand un terminal se ferme, il envoie un signal SIGHUP (Signal Hang UP) à tous les processus enfants. Ce signal cause normalement l'arrêt du processus. C'est un mécanisme historiqueherited du temps où les terminaux étaient des machines physiques.
# Lancer un script long en arrière-plan$ ./backup_complete.sh &[1] 12345$ exit# Le script s'est arrêté !nohup protège un processus contre le signal SIGHUP. Le processus continuera à tourner même si le terminal est fermé.
# Syntaxe de basenohup commande [arguments] &# Lancer un script qui survit à la déconnexion$ nohup ./backup.sh &nohup: appending output to 'nohup.out'# Lancer avec redirection de sortie$ nohup ./script.sh > resultat.log 2>&1 &[1] 12346# Lancer sans générer de fichier nohup.out$ nohup ./script.sh > /dev/null 2>&1 &# Lancer une commande système$ nohup wget -r https://example.com/fichier.zip &nohup: appending output to 'nohup.out'Par défaut, nohup redirige la sortie standard vers nohup.out. Vous pouvez changer ce comportement :
| Commande | Résultat |
|---|---|
nohup cmd & | Sortie dans nohup.out |
nohup cmd > fichier.log & | Sortie dans fichier.log |
nohup cmd > /dev/null & | Sortie ignorée |
nohup cmd > fichier.log 2>&1 & | Sortie + erreurs dans fichier.log |
# Voir les processus nohup$ ps aux | grep nohupuser 12346 0.0 0.0 14400 1024 ? S 14:30 0:00 nohup ./backup.sh > resultat.log 2>&1# Vérifier le fichier de sortie$ tail -f nohup.outIl existe plusieurs ways de détacher un processus :
| Méthode | Protège de SIGHUP | Survit fermeture terminal | Peut être récupéré |
|---|---|---|---|
nohup | Oui | Oui | Non (en principe) |
disown | Oui | Oui | Non |
screen | Oui | Oui | Oui (session réattachable) |
tmux | Oui | Oui | Oui (session réattachable) |
# Lancer, puis détacher un job déjà actif$ ./script.sh &$ disown %1# Le processus继续 même après exit$ nohup wget -c https://example.com/iso.zip -O fichier.iso &$ exit# Le téléchargement continue !$ nohup ./sauvegarde.sh > /var/log/sauvegarde.log 2>&1 &$ echo "Sauvegarde lancée, ID: $!"# Lancer un serveur Python temporaire$ nohup python3 -m http.server 8080 > /var/log/server.log 2>&1 &# Trouver le PID$ ps aux | grep backup.shuser 12346 0.0 0.0 14400 1024 ? S 14:30 0:00 nohup ./backup.sh# L'arrêter$ kill 12346# ou$ killall backup.sh#!/bin/bash# script de surveillancewhile true; do nohup python3 mon_script.py > /var/log/mon_script.log 2>&1 echo "Script arrêté, redémarrage dans 5s..." sleep 5donenohup commande & — Lance une commande immune au signal SIGHUPnohup.outps aux | grep que le processus tourne toujoursscreen ou tmux (voir leçons 27 et 41)