web-dev-qa-db-fra.com

Quelle est la différence entre Nohup et esperluette

Nohup myprocess.out & ou myprocess.out & permettent à myprocess.out de s'exécuter en arrière-plan. Après avoir arrêté le terminal, le processus est toujours en cours d'exécution. Quelle est la différence entre eux?

215
Yarkee

Nohup intercepte le signal de raccrochage (voir man 7 signal) alors que l'esperluette ne l'utilise pas (sauf que le shell est configuré de cette façon ou n'envoie pas du tout SIGHUP).

Normalement, lors de l'exécution d'une commande utilisant & et de la sortie du shell par la suite, ce dernier termine la sous-commande avec le signal de raccrochage (kill -SIGHUP <pid>). Ceci peut être évité en utilisant Nohup, car il capture 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. Si cette option est désactivée, les processus ne seront pas terminés, comme cela semble être le cas pour vous. Plus d'informations sur la façon dont bash termine les applications peuvent être trouvées ici .

Il existe des cas où Nohup ne fonctionne pas, par exemple lorsque le processus que vous démarrez reconnecte le signal SIGHUP, comme c'est le cas ici .

285
nemo

myprocess.out & exécuterait le processus en arrière-plan à l'aide d'un sous-shell. Si le shell actuel est arrêté (par exemple, par déconnexion), tous les sous-shell sont également fermés, de sorte que le processus d'arrière-plan est également terminé. La commande Nohup ignore le signal HUP. Ainsi, même si le shell actuel est terminé, le sous-shell et le processus myprocess.out continuent de s'exécuter en arrière-plan. Une autre différence est que & ne permet pas à lui seul de rediriger stdout/stderr. Par conséquent, s’il existe 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.

34
amit_g

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 permet de continuer à exécuter le script en arrière-plan, même après votre déconnexion de Shell.

Nohup command name &
eg: Nohup sh script.sh &

Nohup intercepte les signaux HUP. Nohup ne met pas le travail automatiquement en arrière-plan. Nous devons dire que explicitement en utilisant &

23
missgeorge

L'utilisation de l'esperluette (&) exécutera la commande dans un processus enfant (enfant de la session bash en cours). Toutefois, lorsque vous quittez la session, tous les processus enfants seront supprimés.

utiliser Nohup + esperluette (&) fera la même chose, sauf que lorsque la session sera terminée, le processus parent du processus enfant sera remplacé par "1", ce qui correspond au processus "init", ce qui empêchera l'enfant d'être tué.

22
Michel

Corrige moi si je me trompe

  Nohup myprocess.out &

Nohup intercepte le signal de raccrochage, ce qui signifie qu'il enverra un processus à la fermeture du terminal.

 myprocess.out &

Le processus peut s’exécuter mais s’arrêtera une fois le terminal fermé.

Nohup myprocess.out

Processus capable de fonctionner même avec un terminal fermé, mais vous pouvez arrêter le processus en appuyant sur ctrl + z dans le terminal. Crt + z ne fonctionne pas si & existe.

5
John Joe

La commande Nohup est un utilitaire de masquage de signal qui intercepte le signal de raccrochage. Où esperluette ne capte pas les signaux de raccrochage. Le shell mettra fin à la sous-commande avec le signal de raccrochage lorsqu’une commande sera exécutée avec & et quitter le shell. Cela peut être évité en utilisant Nohup, car il capte le signal. La commande Nohup accepte le signal de raccrochage qui peut être envoyé à un processus par le noyau et le bloquer. La commande Nohup est utile lorsqu'un utilisateur souhaite démarrer une application longue, se déconnecter de l'application ou fermer la fenêtre dans laquelle le processus a été lancé. L'une ou l'autre de ces actions invite normalement le noyau à raccrocher, mais un encapsuleur Nohup permettra au processus de continuer. L'utilisation de l'esperluette exécutera la commande dans un processus enfant et cet enfant de la session bash en cours. Lorsque vous quittez la session, tous les processus enfants de ce processus seront supprimés. La perluète concerne le contrôle des tâches pour le shell actif. Ceci est utile pour exécuter un processus dans une session en arrière-plan.

1
santosh