disown
hace que un shell no envíe SIGHUP a su trabajo rechazado cuando finaliza el shell, y
elimina el trabajo rechazado del control de trabajo del shell.
¿Es el primero el resultado del segundo? En otras palabras, si un proceso iniciado desde un shell se elimina del control de trabajo del shell de alguna manera, ¿el shell no enviará SIGHUP al proceso cuando finalice el shell?
disown -h
todavía mantiene un proceso bajo el control de trabajo de un shell. ¿Significa que disown -h
un proceso todavía recibe SIGHUP enviado desde el shell, pero establece la acción de SIGHUP por el proceso como "ignorar"? Eso suena similar a 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
¿ Hacemos disown -h
y nohup
trabajamos efectivamente de la misma manera si ignoramos su diferencia al usar un terminal?
Gracias.
nohup
, debe redirigir stdin / stdout / stderr lejos del TTY (si su shell original está conectado a uno) usted mismo. (OTOH, en realidad considero que es una mejor práctica que depender de un valor predeterminado codificado atroz./nohup.out
)Respuestas:
nohup
ydisown -h
no son exactamente lo mismo.Con
disown
, se elimina un proceso de la lista de trabajos en el shell interactivo actual. La ejecuciónjobs
después de iniciar un proceso en segundo plano y la ejecucióndisown
no mostrarán ese proceso como un trabajo en el shell. Un trabajo rechazado no recibirá unHUP
mensaje del shell cuando salga (pero vea la nota al final).Con
disown -h
, el trabajo no se elimina de la lista de trabajos, pero el shell no le enviará unaHUP
señal si sale (pero vea la nota al final).La
nohup
utilidad ignora laHUP
señal e inicia la utilidad dada. La utilidad hereda la máscara de señalnohup
y, por lo tanto, también ignorará laHUP
señal. Cuando el shell termina, el proceso permanece como un proceso hijo denohup
(ynohup
se vuelve a criar eninit
).La diferencia es que el proceso comenzó con
nohup
ignoraHUP
independientemente de quién envía la señal. Los procesos rechazados simplemente no envían unaHUP
señal por el shell , pero aún pueden enviar la señal, por ejemplo,kill -s HUP <pid>
y no ignorarán esto.Tenga en cuenta que
HUP
solo se envía a los trabajos de un shell sihuponexit
opción de shell, oHUP
señal.Pedazos relevantes del
bash
manual (mi énfasis):Relacionado:
fuente
bash: disown: nohup: no such job
mismo porsleep
y5
desdedisown nohup sleep 5 &
. ¿Qué quisiste decir con ese segundo comando de la última oración?&
allí (y el orden denohup
ydisown
también estaba equivocado). Gracias. Se actualizará ahora.disown
hace que un shell no envíe SIGHUP a un hijo quitando el hijo de la lista de trabajos del shell. ¿Cómo sedisown -h
logra lo mismo?Ellos son diferentes:
disown elimina el trabajo de la tabla de trabajos activos. Luego continúa con el trabajo actual. Con -h el proceso NO se envía SIGHUP. En cambio, se deja morir con el caparazón que lo contiene, cuando recibe un VISTAZO.
nohup ignora el HUP. Luego, todo lo que hubiera pasado al terminal por el cierre del proceso en su lugar va a un archivo
nohup.out
.fuente