Quelle est la différence entre nohup et esperluette
Les deux nohup myprocess.out &
ou myprocess.out &
ensemble myprocess.pour exécuter en arrière-plan. Après j'ai arrêté le terminal, le processus est toujours en cours d'exécution.
Quelle est la différence entre eux?
- ce shell que vous utilisez? le comportement varie à travers les coquilles
- bash. Et je sais pourquoi maintenant selon @nemo 's réponse.
- si la réponse adaptée à votre problème, veuillez cocher la question accepté (la case à cocher ci-dessous la réponse de la voix), il n'est donc pas balançant autour comme sans réponse. Vous devez le faire pour toutes vos questions 🙂
shutdown
doit être évitée comme un terme avec un Linux sens., et être remplacé parexit
.
Vous devez vous connecter pour publier un commentaire.
nohup
capte le signal de raccrochage (voirman 7 signal
), tandis que l'esperluette n'est pas (à l'exception de la coquille est configuré sous un autre numéro de cette façon ou de ne pas envoyer deSIGHUP
à tous).Normalement, lors de l'exécution d'une commande à l'aide
&
et quitter le shell par la suite, le shell va mettre fin à la sous-commande avec le signal de raccrochage (kill -SIGHUP <pid>
). Cela peut être évité en utilisantnohup
, comme il capte le signal et l'ignore alors qu'il n'atteint jamais le réel de l'application.Dans le cas où vous utilisez bash, vous pouvez utiliser la commande
shopt | grep hupon
pour savoir sivotre shell envoie un signal SIGHUP à ses processus enfants ou pas. Si elle est désactivée, les processus ne sera pas
résilié, comme cela semble être le cas pour vous. Plus d'informations sur comment se termine bash
les applications peuvent être trouvés ici.
Il y a des cas où
nohup
ne fonctionne pas, par exemple, lorsque le processus de démarrage se reconnectele
SIGHUP
signal, comme c'est le cas ici.myprocess.out &
irait le processus en arrière-plan à l'aide d'un shell interne est exécuté. Si le shell en cours est terminée (disons de déconnexion), tous les sous-coquille sont également résilié de sorte que le processus d'arrière-plan aurait également être résilié. Le nohup commande ignore laHUP
signal et donc même si le shell en cours est terminée, le shell interne est exécuté et la myprocess.allait continuer à s'exécuter en arrière-plan. Une autre différence est que&
seul ne pas rediriger la sortie standard stdout/stderr, donc si il y a une sortie ou d'une erreur, ceux qui sont affichés sur le terminal. nohup d'autre part rediriger la sortie standard stdout/stderr à nohup.ou $HOME/nohup.out.myprocess.out &
et quitter le shell. Cependant, lorsque j'utiliseps aux | grep myprocess.out
dans d'autres coquille, je ne peut toujours trouver un "myprocess.out". Cela signifie que le processus est toujours en cours, de ne pas être résilié.kill -9
il n'y aura pas un SIGHUP, car cela nécessiterait de la mère de shell pour gérer SIGKILL, qui elle ne peut pas.La plupart du temps nous connecter à un serveur distant en utilisant le protocole ssh. Si vous lancez un script shell et vous vous déconnecter puis le processus est tué.
Nohup permet de poursuivre l'exécution du script en arrière-plan, même lorsque vous ouvrez une session de shell.
Nohup captures de l'HUP signaux.
Nohup ne pas mettre le travail automatiquement en arrière-plan. Nous avons besoin de dire explicitement à l'aide de &
L'aide de l'esperluette (&) doit exécuter la commande dans un processus enfant (enfant de l'actuelle session bash). Toutefois, lorsque vous quittez la session, tous les processus enfants seront tués.
à l'aide de nohup + esperluette (&) fera la même chose, sauf que lorsque la session se termine, le parent de l'enfant, le processus sera changé à "1" qui est le "init" du processus, ce qui permet de préserver l'enfant de la mort.
Corrigez-moi si je me trompe
nohup attrape le raccrochage du signal, ce qui signifie qu'il va envoyer à un processus quand le terminal est fermé.
Processus peut s'exécuter mais sera arrêtée une fois que le terminal est fermé.
Processus de mesure d'exécuter le 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&
est existant.Le nohup commande est un signal de masquage utilitaire et capte le signal de raccrochage. Où que l'esperluette ne pas attraper le blocage des signaux. Le shell va mettre fin à la sous-commande avec l'accrocher signal lors de l'exécution d'une commande à l'aide de &, et la sortie de la coquille. Ceci peut être évité en utilisant nohup, qu'il attrape le signal. Nohup commande accepter raccrocher signal qui peut être envoyé à un processus par le noyau et de les bloquer. Nohup commande est utile lorsque l'utilisateur veut commencer le long de l'application en cours d'exécution de journal ou de fermer la fenêtre dans laquelle le processus a été initié. L'une de ces actions normalement invite le noyau de raccrocher au nez de l'application, mais un nohup wrapper permettre la poursuite du processus.
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'esperluette concerne le contrôle du travail pour les actifs de shell. Ceci est utile pour l'exécution d'un processus dans une session à l'arrière-plan.
Il y a de nombreux cas où les petites différences entre les environnements peut vous mordre. C'est l'une dans laquelle j'ai couru récemment. Quelle est la différence entre ces deux commandes?
La réponse est la même que d'habitude - il dépend.
nohup attrape le raccrochage signal alors que l'esperluette ne pas.
Qu'est-ce que le signal de raccrochage?
SIGHUP - hangup détecté sur le terminal de contrôle ou de la mort de contrôle de processus (valeur: 1).
Normalement, lors de l'exécution d'une commande à l'aide de &, et la sortie de la coquille par la suite, le shell va mettre fin à la sous-commande avec le signal de raccrochage (comme tuer -SIGHUP $PID). Cela peut être évité en utilisant nohup, comme il capte le signal et l'ignore alors qu'il n'atteint jamais le réel de l'application.
Bien, mais comme dans ce cas, il y a toujours un ‘mais’. Il n'y a pas de différence entre le lancement de ces méthodes lorsque la coquille est configuré dans une voie où il n'envoie pas un signal SIGHUP à tous.
Dans le cas où vous utilisez bash, vous pouvez utiliser la commande spécifiée ci-dessous pour savoir si votre shell envoie un signal SIGHUP à son enfant ou non des procédés:
Et d'ailleurs - il y a des cas où nohup ne fonctionne pas. Par exemple, lorsque le processus de démarrage se reconnecte le NOHUP signal (c'est fait à l'intérieur, sur le niveau de code d'application).
Dans le cas décrit, l'absence de différences peu de moi quand à l'intérieur d'un service personnalisé script de lancement il y a un appel à un autre script qui installe et lance l'application correcte sans un nohup commande.
Sur un environnement Linux tout a fonctionné sans problème, sur un second, la fermeture de l'application dès que le second script est sorti (détection de ce cas, bien sûr, m'a pris beaucoup plus de temps alors que vous pourriez penser :stuck_out_tongue:).
Après l'ajout de nohup comme un lancement de la méthode de second script, l'application continue de fonctionner même si les scripts ne sont de sortie et ce comportement est devenu de manière cohérente sur les deux environnements.