Aller au contenu
English
Compte : non connecté, synchronisation possible Mon apprentissage
Selectionner le thème
English

Utiliser nohup pour maintenir un processus actif

Par mis à jour le

Améliorer cette page

nohup commande &, c'est tout ce qu'il faut taper pour qu'une commande survive à votre déconnexion SSH. Quand le terminal se ferme, votre shell reçoit le signal SIGHUP et le relaie à ses tâches, qui se terminent. nohup fait ignorer ce signal à la commande, et redirige sa sortie loin du terminal disparu. Les comportements décrits ici ont été mesurés sur Debian 13, Ubuntu 24.04 et AlmaLinux 10, en fermant réellement le terminal d'un Bash interactif.

  • Comprendre pourquoi un processus meurt à la déconnexion (SIGHUP)
  • Lancer une commande avec nohup et &
  • Rediriger stdout et stderr vers un fichier de log dédié
  • Combiner nohup avec disown pour une protection maximale
  • Retrouver le processus après reconnexion avec pgrep ou ps

nohup répond à un besoin précis : lancer une tâche longue sur une machine distante et couper la connexion sans la tuer. Les trois situations ci-dessous partagent le même point commun, un processus dont la durée dépasse celle de votre session. Si à l'inverse vous avez besoin de revoir la sortie en direct après reconnexion, ou de reprendre la main sur le programme, nohup ne suffit pas et c'est tmux qu'il vous faut, comparé en fin de guide.

  • Vous lancez une sauvegarde, une compilation, un transfert de données via SSH.
  • Vous ne pouvez pas ou ne voulez pas laisser le terminal ouvert.
  • Vous n'avez pas tmux disponible sur la machine distante.

Quand vous vous déconnectez d'une session SSH, le terminal disparaît et le noyau envoie SIGHUP (signal 1, hang up) au shell, qui le relaie à ses tâches avant de quitter. Par défaut, la plupart des commandes réagissent à SIGHUP en se terminant. Mesuré en fermant le terminal d'un Bash interactif, à l'identique sur les trois distributions :

LancementAprès la fermeture du terminal
sleep 600 &mort
sleep 600 > log 2>&1 &mort : rediriger la sortie ne protège pas
nohup sleep 600 > log 2>&1 &vivant
sleep 600 & puis disownvivant
nohup sleep 600 au premier plan, sans &vivant, mais le terminal était bloqué

Pour reproduire l'effet sans vous déconnecter, envoyez le signal vous-même au processus dont vous avez noté le PID :

Fenêtre de terminal
kill -HUP "$PID"

nohup contourne ce mécanisme en configurant l'ignorance de SIGHUP avant d'exécuter la commande. Une seule exception à connaître : si l'administrateur a réglé KillUserProcesses=yes dans /etc/systemd/logind.conf, systemd tue tous les processus de la session à la déconnexion, nohup compris. Les trois distributions livrent la valeur par défaut no (ligne #KillUserProcesses=no, relevée dans le fichier).

La forme à mémoriser tient en deux éléments qui jouent des rôles distincts et complémentaires : nohup détache la commande du signal SIGHUP, et & la renvoie en arrière-plan pour vous rendre la main. L'oubli le plus courant est de taper nohup commande sans le & : la commande ignore bien SIGHUP, mais elle occupe votre terminal, et vous ne pouvez plus rien y faire jusqu'à la fin. Notez la variable $! juste après le lancement, elle contient le PID du dernier processus mis en arrière-plan, votre seul moyen fiable de le retrouver ensuite.

Fenêtre de terminal
nohup commande arguments &
  • nohup : configure l'ignorance de SIGHUP puis exécute la commande
  • & : place le processus en arrière-plan (indispensable, sans &, nohup bloque le terminal)
Fenêtre de terminal
# Exemple concret
nohup rsync -avz /data/ user@serveur:/backup/ &
echo "Sauvegarde lancée, PID=$!"

Si vous ne redirigez pas la sortie, nohup crée automatiquement un fichier nohup.out dans le répertoire courant pour capturer stdout, et le signale (message relevé en locale C) :

Fenêtre de terminal
cd ~
nohup mon-script.sh &
# nohup: ignoring input and appending output to 'nohup.out'
ls -la nohup.out
tail -f nohup.out # surveiller la progression

Si le répertoire courant n'est pas accessible en écriture, nohup se replie sur $HOME/nohup.out et l'annonce : mesuré, un utilisateur placé dans un répertoire de root obtient appending output to '/home/testeur/nohup.out'.

La bonne pratique est de spécifier vous-même le fichier de log :

Fenêtre de terminal
nohup mon-script.sh > /var/log/mon-script.log 2>&1 &
PID=$!
echo "PID=$PID, logs dans /var/log/mon-script.log"
  • > fichier.log : redirige stdout
  • 2>&1 : redirige stderr vers le même fichier
  • Quand vous redirigez explicitement, nohup.out n'est pas créé

Pour suivre l'avancement en temps réel depuis une autre connexion :

Fenêtre de terminal
tail -f /var/log/mon-script.log

nohup protège contre SIGHUP. disown retire la tâche de la table de jobs du shell. Combinés, ils offrent la protection maximale :

Fenêtre de terminal
nohup ma-commande > sortie.log 2>&1 &
PID=$!
disown $PID
echo "Tâche $PID lancée, protégée contre HUP et détachée du shell"

Quand utiliser la combinaison ?

  • Quand vous travaillez dans un shell interactif et que vous ne voulez aucun risque de fin prématurée.
  • Quand vous voulez en plus que la tâche disparaisse de jobs, pour ne plus la confondre avec les suivantes.

Après déconnexion et reconnexion, votre nouveau shell n'a aucune mémoire des tâches précédentes : jobs ne montre rien. Retrouvez le processus par son nom avec pgrep, qui ne compare que les 15 premiers caractères du nom ; pour un script au nom long, cherchez dans la ligne de commande complète avec pgrep -f.

Fenêtre de terminal
# Par nom de commande
pgrep -a mon-script
pgrep -u bob rsync
# Par PID (si vous l'avez noté)
ps -p 1234 -o pid,stat,comm,etime
# Lire les logs
tail -f /var/log/mon-script.log
OutilQuand l'utiliserAvantageLimite
nohup commande &Tâche simple, connexion uniqueUne commande suffitPas d'interactivité possible après
disown -h $PIDCommande déjà lancée sans nohupRattrapage après le faitLa sortie reste dirigée vers le terminal fermé si elle n'a pas été redirigée
nohup ... & disownProtection maximaleImmunisé SIGHUP et détachéPas de reprise interactive
tmuxSession interactive, suivi en directReconnexion complète possibleNécessite tmux installé

Presque tous les ennuis avec nohup tournent autour de deux oublis : le & manquant, qui fige le terminal, et la redirection absente, qui éparpille des nohup.out dans le répertoire de lancement. Le tableau ci-dessous part du symptôme observé, car c'est ce que vous voyez en premier ; dans chaque cas, la vraie cause est presque toujours l'un de ces deux réflexes non pris. Retenez que nohup.out est écrit dans le répertoire courant au moment du lancement, pas là où le script travaille ensuite.

SymptômeCause probableSolution
nohup.out absent alors que la tâche tourneSortie redirigée explicitementNormal, cherchez votre fichier de log
nohup.out dans le mauvais dossiernohup crée le fichier dans $PWD au moment du lancementToujours spécifier un chemin absolu en redirection
Le terminal reste bloqué après nohup commande& oublié : la commande tourne au premier plan (elle survit pourtant à la déconnexion, mesuré)Ctrl+Z puis bg, ou relancer avec nohup commande &
La tâche meurt malgré nohupKillUserProcesses=yes dans /etc/systemd/logind.confVérifier ce réglage, ou lancer la tâche comme service
Impossible de retrouver le processus après reconnexionPID non noté, commande trop génériqueToujours noter le PID ou utiliser une commande avec un nom unique
Deux nohup.out qui se mélangentDeux tâches nohup dans le même répertoire sans redirectionUtiliser des fichiers de log distincts pour chaque tâche
  • nohup fait ignorer SIGHUP : la commande ne se termine plus à la déconnexion SSH, là où un simple & meurt (mesuré).
  • Sans redirection, la sortie part dans nohup.out, ou dans $HOME/nohup.out si le répertoire courant est protégé.
  • Ajoutez toujours &, sans lui, nohup bloque votre terminal.
  • Redirigez explicitement vers un fichier de log : nohup commande > mon.log 2>&1 &
  • Combinez avec disown $! pour une protection complète.
  • Notez le PID ou utilisez un nom de log explicite pour retrouver la tâche après reconnexion.

Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

6 questions
6 min.
70% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

Ce projet vous est utile ?

Les guides, formations, quiz et labs restent gratuits. Si vous les utilisez régulièrement, vous pouvez contribuer à leur maintenance et à leur développement.

Devenir membre de soutien (nouvel onglet) Soutenir une fois (nouvel onglet) En savoir plus

Suivez aussi le projet sur LinkedIn