← Sommaire SkyLinux

Leçon 70 : nohup — Exécuter des commandes persistantes

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.

1. Le problème : les signaux et la 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.

Exemple du problème

# Lancer un script long en arrière-plan
$ ./backup_complete.sh &
[1] 12345
$ exit
# Le script s'est arrêté !

2. La solution : nohup

nohup protège un processus contre le signal SIGHUP. Le processus continuera à tourner même si le terminal est fermé.

# Syntaxe de base
nohup commande [arguments] &

Exemples pratiques

# 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'

3. Où va la sortie ?

Par défaut, nohup redirige la sortie standard vers nohup.out. Vous pouvez changer ce comportement :

CommandeRé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

4. Vérifier que le processus tourne

# Voir les processus nohup
$ ps aux | grep nohup
user 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.out

5. nohup vs disown vs screen

Il existe plusieurs ways de détacher un processus :

MéthodeProtège de SIGHUPSurvit fermeture terminalPeut être récupéré
nohupOuiOuiNon (en principe)
disownOuiOuiNon
screenOuiOuiOui (session réattachable)
tmuxOuiOuiOui (session réattachable)

Exemple avec disown

# Lancer, puis détacher un job déjà actif
$ ./script.sh &
$ disown %1
# Le processus继续 même après exit

6. Cas d'usage concrets

Téléchargement long

$ nohup wget -c https://example.com/iso.zip -O fichier.iso &
$ exit
# Le téléchargement continue !

Script de sauvegarde

$ nohup ./sauvegarde.sh > /var/log/sauvegarde.log 2>&1 &
$ echo "Sauvegarde lancée, ID: $!"

Service temporaire

# Lancer un serveur Python temporaire
$ nohup python3 -m http.server 8080 > /var/log/server.log 2>&1 &

7. Arrêter un processus nohup

# Trouver le PID
$ ps aux | grep backup.sh
user 12346 0.0 0.0 14400 1024 ? S 14:30 0:00 nohup ./backup.sh
# L'arrêter
$ kill 12346
# ou
$ killall backup.sh

8. Scripts pratiques avec nohup

Relancer automatiquement si plantage

#!/bin/bash
# script de surveillance
while true; do
nohup python3 mon_script.py > /var/log/mon_script.log 2>&1
echo "Script arrêté, redémarrage dans 5s..."
sleep 5
done

Résumé