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»?
nohup
passe. Quelle partie avez-vous confondue?Réponses:
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
cd
les fonctions shell, ne génèrent généralement pas de nouveau processus.type cmd
vous indiquera généralement s'ilcmd
s'agit d'une commande externe ou d'une fonction shell.type type
vous indique quetype
lui - même est une fonction shell.nohup
est quelque chose de différent. Il indique au nouveau processus d'ignorerSIGHUP
. Il s'agit du signal envoyé par le noyau lorsque le shell parent est fermé.Pour répondre à votre question, procédez comme suit:
emacs &
(par défaut doit s'exécuter dans une fenêtre X distincte) .exit
.Vous remarquerez que la
emacs
fenêtre est tuée, malgré l'exécution en arrière-plan. Il s'agit du comportement par défaut etnohup
est utilisé précisément pour le modifier.L'exécution d'un travail en arrière-plan (avec
&
oubg
, 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
.nohup
Est-ce que.la source
SIGHUP
à ses processus enfants lorsque le shell lui-même reçoitSIGHUP
, pas lorsque le shell se termine normalement. bash a une optionhuponexit
qui l'envoieSIGHUP
aux enfants à sa sortie, mais elle n'est pas activée par défaut. gnu.org/software/bash/manual/bashref.html#Signals&
et j'ai fermé mon shell en exécutantexit
. 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?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 ... &
, lanohup
commande définit SIGHUP sur ignoré, puis exécute la commande. Cette commande nouvellement exécutée conserve le masque de signalnohup
configuré, à 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'
nohup
exécution d'une commande on lui permet de continuer à fonctionner après la fermeture de xterm ou la déconnexion.la source
&
withnohup
maintient la commande en cours d'exécution dans certains cas où seule l'utilisationnohup
ne le serait pas? Cela semble entrer en conflit avec la réponse ici: unix.stackexchange.com/a/288064/1822nohup
fait 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 simplenohup
ne permettrait pas. Comme fermer le xterm associé au shell qui a fait le nohup, ou se déconnecter.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:
Après la connexion, vérifiez le nombre de lignes dans le fichier de sortie
ping_result
qui 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 lanohup
commande.un autre scénario ==> comme indiqué ci-dessus pour
nohup emac &
-> qui devrait continuer àemac
fonctionner après la déconnexion du système, mais il ne s'affiche pas après la reconnexion.la source