Nohup
| Fiche express | |
|---|---|
| Domaine | Détachement d'un processus du terminal |
| Commande | nohup
|
| Signal concerné | SIGHUP |
| Sortie par défaut | nohup.out
|
| Voir aussi | disown · setsid · Screen
|
nohup ("no hang up") lance une commande en la rendant immunisée contre le signal SIGHUP. Ce signal est envoyé par le shell à ses processus enfants lorsque la session qui les a lancés se termine (fermeture de terminal, déconnexion SSH) ; par défaut il tue le processus, ce qui interrompt tout traitement encore en cours. nohup permet donc de lancer une tâche longue et de se déconnecter sans l'interrompre.
Usage
nohup ./script_long.sh &
nohup ./script_long.sh > sortie.log 2>&1 &
nohup ignore uniquement SIGHUP — il ne met pas la commande en arrière-plan tout seul. Sans le & final, la commande reste au premier plan et bloque le terminal (on peut alors la basculer en arrière-plan après coup avec Ctrl+Z puis bg).
Le fichier nohup.out
Si la sortie standard n'est pas redirigée et pointe vers un terminal, nohup la redirige automatiquement vers un fichier nohup.out dans le répertoire courant (ou, si celui-ci n'est pas accessible en écriture, vers $HOME/nohup.out ; à vérifier selon l'implémentation exacte de coreutils). La sortie d'erreur suit la même redirection sauf si elle est déjà redirigée explicitement. En pratique, mieux vaut toujours rediriger soi-même la sortie (comme dans le second exemple ci-dessus) plutôt que de dépendre de ce comportement par défaut.
Limites
- Ne détache pas réellement le processus de la session au sens noyau (contrairement à
setsid) — il ignore juste un signal précis. - N'aide pas à revenir consulter la sortie interactivement une fois la commande lancée : pas de "reprise" possible, juste un fichier de log.
- Si le shell parent ou la session entière est tuée plus brutalement (SIGKILL, arrêt de la machine),
nohupn'y change rien.
Alternatives
disown — commande interne du shell (bash) : au lieu d'ignorer SIGHUP à l'avance, elle retire après coup un job de la table des jobs du shell, qui ne lui enverra donc plus SIGHUP à la fermeture. Utile pour une commande déjà lancée en arrière-plan sans y avoir pensé au démarrage :
./script_long.sh &
disown # ou disown %1 pour un job précis
setsid — va plus loin que nohup : lance la commande dans une toute nouvelle session, sans terminal de contrôle du tout, donc insensible à n'importe quel signal émis par le terminal (pas seulement SIGHUP) :
setsid ./script_long.sh &
Multiplexeurs de terminal — pour un usage interactif (pouvoir se reconnecter et retrouver l'affichage en cours, pas juste un fichier de log), un multiplexeur comme Screen est plus adapté : la session tourne indépendamment du terminal et se rattache à volonté (screen -r). tmux offre un fonctionnement comparable mais n'est pas encore couvert sur ce wiki.
Voir aussi
disown— détache après coup un job du shell courantsetsid— détachement complet de session, au-delà du seul SIGHUP- Screen — multiplexeur de terminal, sessions persistantes et ré-attachables