disown
faz com que um shell não envie SIGHUP para seu trabalho renegado quando o shell termina e
remove o trabalho renegado do controle de trabalho do shell.
O primeiro é o resultado do segundo? Em outras palavras, se um processo iniciado a partir de um shell for removido do controle de trabalho do shell de alguma forma, o shell não enviará SIGHUP para o processo quando o shell terminar?
disown -h
ainda mantém um processo sob o controle de trabalho de um shell. Isso significa que disown -h
faz com que um processo ainda receba o SIGHUP enviado do shell, mas configura a ação do SIGHUP pelo processo para "ignorar"? Isso soa semelhante 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
Faça disown -h
e nohup
trabalhe efetivamente da mesma forma, se desconsiderarmos a diferença entre eles no uso de um terminal?
Obrigado.
nohup
, precisará redirecionar stdin / stdout / stderr para longe do TTY (caso seu shell original esteja conectado a um). (OTOH, na verdade, considero essa prática melhor do que confiar em um padrão codificado egregado como./nohup.out
).Respostas:
nohup
edisown -h
não são exatamente a mesma coisa.Com
disown
, um processo é removido da lista de trabalhos no shell interativo atual. A execuçãojobs
após o início de um processo em segundo plano e a execuçãodisown
não mostrará esse processo como um trabalho no shell. Um trabalho renegado não receberá umHUP
do shell quando sair (mas consulte a observação no final).Com
disown -h
, o trabalho não é removido da lista de trabalhos, mas o shell não enviaria umHUP
sinal se saísse (mas veja a observação no final).O
nohup
utilitário ignora oHUP
sinal e inicia o utilitário especificado. O utilitário herda a máscara de sinalnohup
e, portanto, também ignorará oHUP
sinal. Quando o shell termina, o processo permanece como um processo filho denohup
(enohup
é reinserido como paiinit
).A diferença é que o processo iniciado com
nohup
ignora,HUP
independentemente de quem envia o sinal. Os processos deserdado não são apenas enviou umHUP
sinal pelo shell , mas ainda pode ser enviado o sinal a partir por exemplokill -s HUP <pid>
e não irá ignorar isso.Observe que
HUP
somente é enviado para os trabalhos de um shell sehuponexit
opção shell está definida ouHUP
sinal.Bits relevantes do
bash
manual (minha ênfase):Relacionado:
fonte
bash: disown: nohup: no such job
mesmo parasleep
e5
dedisown nohup sleep 5 &
. O que você quis dizer com esse segundo comando da última frase?&
lá (e a ordemnohup
edisown
também estava errado). Obrigado. Irá atualizar agora.disown
cria um shell não enviado SIGHUP para um filho removendo o filho da lista de trabalhos do shell. Comodisown -h
conseguir o mesmo?Eles são diferentes:
Disown remove o trabalho da tabela de trabalhos ativos. Em seguida, continua com o trabalho atual. Com -h, o processo NÃO é enviado SIGHUP. Em vez disso, resta morrer com a concha que a contém, quando recebe um SIGHUP.
nohup ignora o HUP. Então, qualquer coisa que teria sido passada ao terminal pelo fechamento do processo será enviada para um arquivo
nohup.out
.fonte