275 votes

Quelle est la différence entre une bague et une esperluette ?

Les deux sites nohup myprocess.out & o myprocess.out & pour que monprocessus.out s'exécute en arrière-plan. Après avoir fermé le terminal, le processus est toujours en cours d'exécution. Quelle est la différence entre les deux ?

0 votes

Quel shell utilisez-vous ? Le comportement varie selon les shells.

1 votes

Bash. Et je sais maintenant pourquoi d'après la réponse de @nemo.

1 votes

@Yarkee si la réponse convient à votre problème, veuillez marquer la question comme acceptée (la case à cocher sous les votes de la réponse) afin qu'elle ne traîne pas comme sans réponse. Vous devriez faire de même pour toutes vos questions :)

357voto

nemo Points 13983

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

Normalement, lorsqu'on exécute une commande en utilisant & et en quittant l'interpréteur de commandes par la suite, l'interpréteur de commandes mettra fin à la sous-commande avec le signal de suspension ( kill -SIGHUP <pid> ). Cela peut être évité en utilisant nohup Le système de gestion de l'information de l'entreprise a été conçu de telle sorte qu'il capte le signal et l'ignore, de sorte qu'il n'atteint jamais l'application réelle.

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 désactivé, 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 des applications peuvent être trouvées aquí .

Il y a des cas où nohup ne fonctionne pas, par exemple lorsque le processus que vous lancez se reconnecte le site SIGHUP signal, comme c'est le cas aquí .

1 votes

Il est intéressant de noter que seulement & fait que la sous-commande ne reçoit pas certains signaux (par exemple, SIGINT). nohup essentiellement pour ajouter SIGHUP à la liste des signaux qui ne sont pas propagés.

58voto

amit_g Points 15415

myprocess.out & exécuterait le processus en arrière-plan en utilisant un sous-shell. Si le shell actuel est terminé (par exemple par une déconnexion), tous les sous-shells sont également terminés et le processus en arrière-plan sera également terminé. Le site nohup ignore le HUP et donc, même si la coquille actuelle est terminée, la sous-coquille et le signal 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 des sorties ou des erreurs, elles sont affichées sur le terminal. nohup, par contre, redirige le stdout/stderr à nohup.out o $HOME/nohup.out .

6 votes

Je cours myprocess.out & et quittez le shell. Cependant, lorsque j'utilise ps aux | grep myprocess.out dans l'autre shell, je peux toujours trouver "myprocess.out". Cela signifie que le processus est toujours en cours, et qu'il n'a pas été arrêté.

1 votes

@amit_g Lorsque l'on tue le shell parent avec kill -9 il n'y aura pas de SIGHUP car cela nécessiterait que le shell parent gère SIGKILL, ce qu'il ne peut pas faire.

2 votes

Vérifiez shopt | grep hupon comme mentionné dans l'autre réponse.

42voto

mia Points 11

La plupart du temps, nous nous connectons à un serveur distant en utilisant ssh. Si vous démarrez un shell script et que vous vous déconnectez alors le processus est tué. Nohup permet de continuer à exécuter le script en arrière-plan même après que vous vous soyez déconnecté du shell.

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

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

0 votes

Merci. Je n'attendais pas votre réponse, mais le fait qu'elle soit là est formidable. Elle répond à la question que je n'avais pas posée :D

33voto

Michel Points 61

L'utilisation de l'esperluette (&) permet d'exécuter la commande dans un processus enfant (enfant de la session bash actuelle). Cependant, lorsque vous quittez la session, tous les processus enfants seront tués.

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

8voto

John Joe Points 971

Corrigez-moi si je me trompe

  nohup myprocess.out &

nohup attrape le signal d'arrêt, ce qui signifie qu'il enverra un processus lorsque le terminal sera fermé.

 myprocess.out &

Le processus peut être exécuté mais sera arrêté dès que le terminal sera fermé.

nohup myprocess.out

Le processus peut être exécuté même si le terminal est fermé, mais vous pouvez l'arrêter en appuyant sur la touche ctrl + z dans le terminal. Crt + z ne fonctionne pas si & existe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X