disown
oblige un shell à ne pas envoyer SIGHUP à son travail renié lorsque le shell se termine, et
supprime le travail désavoué du contrôle du travail du shell.
Le premier est-il le résultat du second? En d'autres termes, si un processus démarré à partir d'un shell est supprimé du contrôle de travail du shell de quelque façon que ce soit, le shell n'enverra-t-il pas SIGHUP au processus lorsque le shell se terminera?
disown -h
garde toujours un processus sous le contrôle du travail d'un shell. Cela signifie-t-il que disown -h
fait qu'un processus reçoit toujours SIGHUP envoyé par le shell, mais configure l'action de SIGHUP par le processus pour qu'il soit "ignoré"? Cela ressemble à nohup
.
$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+ Running sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+ Stopped sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit
$ ps aux | grep sleep
t 26103 0.0 0.0 14584 824 ? S 15:19 0:00 sleep 123
Faire disown -h
et nohup
travailler efficacement la même chose, si nous ne tenons pas compte de leur différence dans l'utilisation d'un terminal?
Merci.
nohup
, vous devez rediriger stdin / stdout / stderr loin du TTY (si votre shell d'origine est connecté à un) vous-même. (OTOH, je considère en fait cette meilleure pratique que de compter sur un défaut codé en dur flagrant comme./nohup.out
).Réponses:
nohup
etdisown -h
ne sont pas exactement la même chose.Avec
disown
, un processus est supprimé de la liste des travaux dans le shell interactif actuel. L'exécutionjobs
après le démarrage d'un processus d'arrière-plan et l'exécutiondisown
n'affichera pas ce processus en tant que travail dans le shell. Un job renié ne recevra pasHUP
de shell à sa sortie (mais voir note à la fin).Avec
disown -h
, le travail n'est pas supprimé de la liste des travaux, mais le shell ne lui enverrait pas deHUP
signal s'il se fermait (mais voir la note à la fin).L'
nohup
utilitaire ignore leHUP
signal et démarre l'utilitaire donné. L'utilitaire hérite du masque de signalnohup
et ignorera donc également leHUP
signal. Lorsque le shell se termine, le processus reste un processus enfant denohup
(etnohup
est re-parentéinit
).La différence est que le processus démarré avec
nohup
ignoreHUP
quel que soit le destinataire du signal. Les processus désavoué sont tout simplement pas envoyé unHUP
signal de par le shell , mais peuvent encore être envoyés le signal par exemplekill -s HUP <pid>
et ne l' ignorer.Notez que ce
HUP
n'est envoyé aux travaux d'un shell que sihuponexit
option shell est définie, ouHUP
signal.Bits pertinents du
bash
manuel (c'est moi qui souligne):En relation:
la source
bash: disown: nohup: no such job
et même poursleep
et5
depuisdisown nohup sleep 5 &
. Que vouliez-vous dire par ce deuxième commandement de la dernière phrase?&
(et l'ordre denohup
etdisown
était également faux). Merci. Mettra à jour maintenant.disown
rend un shell non envoyé SIGHUP à un enfant en supprimant l'enfant de la liste des tâches du shell. Comment ydisown -h
parvenir?Ils sont différents:
disown supprime le travail de la table des travaux actifs. Poursuit ensuite son travail actuel. Avec -h, le processus n'est PAS envoyé SIGHUP. Il est plutôt laissé mourir avec la coquille qui le contient, quand il reçoit un SIGHUP.
nohup ignore le HUP. Ensuite, tout ce qui aurait été transmis au terminal par la fermeture du processus va à la place dans un fichier
nohup.out
.la source