nohup
capte le signal de raccrochage (voir man 7 signal
) tandis que l'esperluette ne le fait pas (sauf que le shell est configuré de cette façon ou n'envoie pas SIGHUP
du tout).
Normalement, lors de l'exécution d'une commande à l'aide de &
et en quittant le shell ensuite, le shell terminera la sous-commande avec le signal de raccrochage (kill -SIGHUP <pid>
). Cela peut être évité en utilisant nohup
, car il capte le signal et l'ignore afin qu'il n'atteigne jamais l'application réelle.
Si vous utilisez bash, vous pouvez utiliser la commande shopt | grep hupon
pour savoir si votre shell envoie ou non SIGHUP à ses processus enfants. S'il est désactivé, les processus ne seront pas terminés, comme cela semble être le cas pour vous. Vous trouverez plus d'informations sur la façon dont bash termine les applications ici.
Il y a des cas où nohup
ne fonctionne pas, par exemple lorsque le processus que vous lancez reconnecte le SIGHUP
signal, comme c'est le cas ici.
myprocess.out &
exécuterait le processus en arrière-plan à l'aide d'un sous-shell. Si le shell actuel est terminé (par exemple par une déconnexion), tous les sous-shells sont également terminés, de sorte que le processus d'arrière-plan serait également terminé. La commande nohup ignore le HUP
signal et donc même si le shell courant est terminé, le sous-shell et myprocess.out
continuerait à fonctionner en arrière-plan. Une autre différence est que &
seul ne redirige pas le stdout/stderr donc s'il y a une sortie ou une erreur, celles-ci sont affichées sur le terminal. nohup d'autre part redirige le stdout/stderr vers nohup.out
ou $HOME/nohup.out
.
La plupart du temps, nous nous connectons au serveur distant en utilisant ssh. Si vous démarrez un script shell et que vous vous déconnectez, le processus est tué. Nohup vous aide à continuer à exécuter le script en arrière-plan même après vous être déconnecté du shell.
Nohup command name &
eg: nohup sh script.sh &
Nohup capte les signaux HUP. Nohup ne met pas automatiquement le travail en arrière-plan. Nous devons dire explicitement qu'en utilisant &