Quand avez-vous besoin de 'nohup' si vous utilisez déjà '&'?

26

Tout d'abord, cette question est liée mais certainement pas la même que cette très belle question:

Différence entre nohup, disown et &

Je veux comprendre quelque chose: quand je fais '&', je bifurque non?

Est-il jamais utile de faire "nohup ... &" ou est-ce simplement et suffisant?

Quelqu'un pourrait-il montrer un cas où vous utiliseriez «&» et voudriez toujours utiliser «nohup»?

Cedric Martin
la source
1
Avez-vous lu la réponse acceptée et son fil de commentaires? Ils expliquent ce qui se nohuppasse. Quelle partie avez-vous confondue?
Gilles 'SO- arrête d'être méchant'
3
@ Gilles: cela peut être évident pour vous , parce que vous êtes familier avec ces choses (vu votre représentant) ... Cependant, pour commencer, la réponse acceptée dans le lien que j'ai mis ne dit pas un mot sur l'utilisation à la fois nohup et '&' ... Je suis à peu près sûr que ma question est suffisamment claire et suffisamment différente de l'autre, et deux excellentes réponses ici semblent le prouver; ) De plus, voulez-vous vraiment dire que j'ai pris la peine de créer un lien vers une autre question, mais sans lire la réponse acceptée!?
Cedric Martin

Réponses:

32

Tout d'abord, à chaque fois que vous exécutez une commande, vous interprétez un shell avec un nouveau processus, que vous l'exécutiez &ou non. &signifie simplement que vous l'exécutez en arrière-plan.

Notez que ce n'est pas très précis. Certaines commandes, comme cdles fonctions shell, ne génèrent généralement pas de nouveau processus. type cmdvous indiquera généralement s'il cmds'agit d'une commande externe ou d'une fonction shell. type typevous indique que typelui - même est une fonction shell.

nohupest quelque chose de différent. Il indique au nouveau processus d'ignorer SIGHUP. Il s'agit du signal envoyé par le noyau lorsque le shell parent est fermé.

Pour répondre à votre question, procédez comme suit:

  1. exécuter emacs & (par défaut doit s'exécuter dans une fenêtre X distincte) .
  2. sur le shell parent, exécutez exit.

Vous remarquerez que la emacsfenêtre est tuée, malgré l'exécution en arrière-plan. Il s'agit du comportement par défaut et nohupest utilisé précisément pour le modifier.

L'exécution d'un travail en arrière-plan (avec &ou bg, je parie que d'autres shells ont également d'autres syntaxes) est une fonctionnalité de shell, issue de la capacité des systèmes modernes à effectuer plusieurs tâches. Au lieu de bifurquer une nouvelle instance de shell pour chaque programme que vous voulez lancer, shells modernes ( bash, zsh, ksh, ...) aura la possibilité de gérer une liste de programmes (ou emplois ). Un seul d'entre eux à la fois peut être au premier plan , ce qui signifie qu'il obtient le focus shell. Je souhaite que quelqu'un puisse développer davantage les différences entre un processus exécuté au premier plan et un en arrière-plan (le principal étant l'accès à stdin/ stdout).

Dans tous les cas, cela n'affecte pas la façon dont le processus enfant réagit SIGHUP. nohupEst-ce que.

rahmu
la source
+1 à vous deux pour les bonnes réponses ... Mais je suis toujours confus ... J'ai essayé avant de répondre à ma question: peut-être que ma (très ancienne) configuration Debian Linux n'est pas correctement configurée mais si je "emacs & "puis tapez" exit ", seul mon xterm sort: emacs y reste.
Cedric Martin
Emacs est suffisamment compliqué pour pouvoir gérer SIGHUP seul. Ce n'est que par défaut que les processus se terminent sur SIGHUP. De nombreux programmes «démon» comme ntpd ou inetd reliront leur configuration sur SIGHUP au lieu de quitter. Je suis moi-même un mec vim, donc je n'ai pas beaucoup d'expérience avec les emacs.
Bruce Ediger
3
Emacs n'a rien de spécial. Un shell envoie généralement SIGHUPà ses processus enfants lorsque le shell lui-même reçoit SIGHUP, pas lorsque le shell se termine normalement. bash a une option huponexitqui l'envoie SIGHUPaux enfants à sa sortie, mais elle n'est pas activée par défaut. gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson
Bonjour. tout d'abord, grande explication. J'ai essayé de vérifier votre thèse en exécutant un processus avec &et j'ai fermé mon shell en exécutant exit. Le processus est toujours en cours. Des idées sur pourquoi il n'a pas été tué? Ou est-ce que je manque quelque chose ici?
Ali Yılmaz
Quel est le processus que vous exécutez?
rahmu
16

Est-il jamais utile de le faire nohup ... &? Oui. Si vous venez de démarrer un processus "en arrière-plan" avec &, ce nouveau processus a toujours l'appartenance au "groupe de processus" du shell d'origine. Si ce shell ou le groupe de processus reçoit certains signaux (SIGHUP, par exemple), ils quittent par défaut. Cela signifie que si vous exécutez un processus avec à &partir d'un shell démarré par un xterm, ou rxvt ou un autre émulateur de terminal de fenêtrage, lorsque vous fermez la fenêtre, le processus d'arrière-plan obtient un SIGHUP. La plupart des codes écrits avec désinvolture ne gèrent pas SIGHUP, et se terminent donc.

Si vous le faites nohup ... &, la nohupcommande définit SIGHUP sur ignoré, puis exécute la commande. Cette commande nouvellement exécutée conserve le masque de signal nohupconfiguré, à moins que la commande ne gère elle-même un signal. Si vous fermez xterm ou rxvt ou autre, le noyau fournit SIGHUP au processus de la commande, qui est ignoré. Il continue de fonctionner.

L' nohupexécution d'une commande on lui permet de continuer à fonctionner après la fermeture de xterm ou la déconnexion.

Bruce Ediger
la source
Désolé - tu m'as perdu. Êtes-vous en train de dire que l'utilisation de &with nohupmaintient la commande en cours d'exécution dans certains cas où seule l'utilisation nohupne le serait pas? Cela semble entrer en conflit avec la réponse ici: unix.stackexchange.com/a/288064/1822
Mike B
2
@MikeB - Le "&" effectue les appels système fork / set things / exec habituels pour mettre la commande "en arrière-plan". Autrement dit, la commande qui obtient nohupped s'exécute de manière asynchrone. Le nohupfait certaines choses avant l' exec()appel système pour que le processus forké ignore certains signaux. Donc, oui, un "&" permettra à une commande de s'exécuter dans certaines circonstances qu'un ancien simple nohupne permettrait pas. Comme fermer le xterm associé au shell qui a fait le nohup, ou se déconnecter.
Bruce Ediger
-1

si vous exécutez un programme en arrière-plan (avec & comme suffixe) sur le système d'exploitation linux et que vous vous déconnectez même après cela, il continuera à fonctionner: essayez avec:

  ping google.com > ping_result  &

Après la connexion, vérifiez le nombre de lignes dans le fichier de sortie ping_resultqui continuera d'augmenter signifie qu'il est toujours en cours d'exécution, mais on lui a dit qu'il serait fermé. alors à quoi sert la nohupcommande.

un autre scénario ==> comme indiqué ci-dessus pour nohup emac &-> qui devrait continuer à emacfonctionner après la déconnexion du système, mais il ne s'affiche pas après la reconnexion.

aditya
la source