Quelle est la différence entre nohup et esperluette

à la fois nohup myprocess.out & ou myprocess.out & set myprocess.pour exécuter en arrière-plan. Après la fermeture du terminal, le processus est toujours en cours. Quelle est la différence entre eux?

178
demandé sur Carl Veazey 2013-03-24 09:01:36

6 réponses

nohup capte le signal de blocage (voir man 7 signal ) alors que l'ampli ne le fait pas (sauf que la coque est confgurée de cette façon ou n'envoie pas du tout SIGHUP ).

normalement, lors de l'exécution d'une commande en utilisant & et en sortant du shell par la suite, le shell terminera la sous-commande avec le signal de blocage ( kill -SIGHUP <pid> ). Cela peut être évité en utilisant nohup , car il saisit le signal et l'ignore de sorte qu'il n'atteint jamais le réel application.

Dans le cas où vous utilisez bash, vous pouvez utiliser la commande shopt | grep hupon pour savoir si votre shell envoie SIGHUP à ses processus enfants ou non. S'il est éteint, les processus ne seront pas résilié, comme cela semble être le cas pour vous. Plus d'informations sur la façon dont bash se termine les applications peuvent être trouvées ici .

il y a des cas où nohup ne fonctionne pas, par exemple lorsque le processus que vous commencez se reconnecte le SIGHUP signal, comme c'est le cas ici .

238
répondu nemo 2017-05-23 12:03:04

myprocess.out & exécuterait le processus en arrière-plan en utilisant un sous-puits. Si le shell courant est terminé (par exemple par déconnexion), tous les sous-couches sont également terminés, donc le processus de background sera également terminé. La commande nohup ignore le signal HUP et donc même si le shell courant est terminé, le sous-puits et le myprocess.allait continuer à s'exécuter 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 redirige le stdout / stderr vers nohup.ou $HOME/nohup.hors.

31
répondu amit_g 2013-03-24 05:32:10

utilisant l'ampli (&) exécutera la commande dans un processus enfant (enfant à la session de bash actuelle). Toutefois, lorsque vous quittez la session, tous les processus enfants seront tués.

en utilisant nohup + ampersand ( & ) fera la même chose, sauf que lorsque la session se termine, le parent du processus de l'enfant sera changé en "1" qui est le processus "init", ce qui préserve l'enfant d'être tué.

20
répondu Michel 2013-07-09 15:36:08

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, alors le processus est tué. Nohup aide à continuer à exécuter le script en arrière-plan même après que vous vous êtes déconnecté de shell.

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

Nohup capte les signaux HUP. Nohup ne met pas le travail automatiquement à l'arrière-plan. Nous devons le dire explicitement en utilisant

."
19
répondu missgeorge 2014-01-07 07:48:54

corrigez - moi si je me trompe

  nohup myprocess.out &

nohup capte le signal de blocage, ce qui signifie qu'il enverra un processus lorsque le terminal sera fermé.

 myprocess.out &
Le processus

peut fonctionner mais s'arrêtera une fois que le terminal sera fermé.

nohup myprocess.out

processus capable d'exécuter même terminal fermé, mais vous êtes en mesure d'arrêter le processus en appuyant sur ctrl + z dans le terminal. Crt + z ne fonctionne pas si & existe.

3
répondu John Joe 2017-02-07 04:51:36

la commande nohup est un service de masquage de signal et capte le signal raccroché. Où comme ampersand ne capte pas les signaux de raccrochage. Le shell terminera la commande sub avec le signal hang up lors de l'exécution d'une commande en utilisant & et en sortant du shell. Cela peut être évité en utilisant nohup, car il saisit le signal. Nohup commande accepter raccrocher signal qui peut être envoyé à un processus par le noyau et de les bloquer. La commande Nohup est utile quand un utilisateur veut commencer à courir longtemps ouverture de session ou fermeture de la fenêtre dans laquelle le processus a été amorcé. L'une ou l'autre de ces actions invite normalement le noyau à raccrocher sur l'application, mais un enveloppeur nohup permettra au processus de continuer. L'aide de l'esperluette doit exécuter la commande dans un processus enfant et cet enfant de l'actuelle session bash. Lorsque vous quittez la session, tous les processus enfants de ce processus sera tué. L'ampersand se rapporte au 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
répondu santosh 2015-12-20 18:10:04