Quais são as diferenças entre
$ nohup foo
e
$ foo &
e
$ foo &
$ disown
shell
nohup
job-control
disown
lesmana
fonte
fonte
foo &!
que deve ser igual a negá-lo desde o início.foo & disown
negar imediatamente.setsid
, e como se relaciona comdisown
enohup
Respostas:
Vamos primeiro ver o que acontece se um programa for iniciado a partir de um shell interativo (conectado a um terminal) sem
&
(e sem nenhum redirecionamento). Então, vamos supor que você acabou de digitarfoo
:foo
é criado.SIGHUP
, ele também enviará umSIGHUP
ao processo (o que normalmente causa o término do processo).Agora, vejamos o que acontece se você colocar o processo em segundo plano, ou seja, digite
foo &
:foo
é criado.jobs
e pode ser acessado usando%n
(onden
está o número do trabalho).fg
, caso em que continua como se você não o tivesse usado&
(e se foi interrompido por tentar ler da entrada padrão, agora pode prosseguir para a leitura no terminal).SIGHUP
, ele também envia umSIGHUP
para o processo. Dependendo do shell e, possivelmente, das opções definidas para o shell, ao finalizar o shell, ele também enviará umSIGHUP
para o processo.Agora,
disown
o trabalho é removido da lista de trabalhos do shell, para que todos os subpontos acima não se apliquem mais (incluindo o processo enviadoSIGHUP
pelo shell). No entanto, observe que ele ainda está conectado ao terminal, portanto, se o terminal for destruído (o que pode acontecer se for um pty, como os criados porxterm
oussh
, e o programa de controle for encerrado, feche o xterm ou encerre a conexão SSH ) , o programa falhará assim que tentar ler da entrada padrão ou gravar na saída padrão.O
nohup
que, por outro lado, é separar efetivamente o processo do terminal:EOF
).nohup.out
, para que o programa não falhe na gravação na saída padrão se o terminal falhar, para que o processo de gravação não seja perdido.SIGHUP
(assim, o nome).Note-se que
nohup
se não remover o processo de controle de tarefas do shell e também não colocá-lo em segundo plano (mas desde um primeiro planonohup
de trabalho é mais ou menos inútil, você geralmente colocá-lo em segundo plano usando&
). Por exemplo, diferentemente dedisown
, o shell ainda informa quando o trabalho de nohup foi concluído (a menos que o shell seja encerrado antes, é claro).Então, para resumir:
&
coloca o trabalho em segundo plano, ou seja, impede a tentativa de ler a entrada e faz com que o shell não aguarde sua conclusão.disown
remove o processo do controle de trabalho do shell, mas ainda o deixa conectado ao terminal. Um dos resultados é que o shell não o envia aSIGHUP
. Obviamente, ele só pode ser aplicado a trabalhos em segundo plano, porque você não pode inseri-lo quando um trabalho em primeiro plano está em execução.nohup
desconecta o processo do terminal, redireciona sua saídanohup.out
e a protegeSIGHUP
. Um dos efeitos (o de nomeação) é que o processo não receberá nenhum envioSIGHUP
. É completamente independente do controle do trabalho e pode, em princípio, ser usado também para trabalhos em primeiro plano (embora isso não seja muito útil).fonte
nohup
, por si só, não salva um processo do google-chrome de ser fechado, quando o terminal a partir do qual foi iniciado é fechado ?disown %1
edisown -h %1
? O segundo manterá um trabalho regular (mas ignora o sinal HUP) até a saída do terminal?(foo&)
subshellO uso
&
faz com que o programa seja executado em segundo plano; portanto, você receberá um novo prompt de shell em vez de bloquear até que o programa termine.nohup
edisown
são amplamente independentes; eles suprimem os sinais SIGHUP (hangup) para que o programa não seja interrompido automaticamente quando o terminal de controle estiver fechado.nohup
faz isso quando o trabalho começa. Se você não executarnohup
um trabalho quando ele começar, poderádisown
modificar um trabalho em execução; sem argumentos, modifica o trabalho atual, que foi o que acabou de ser publicadofonte
nohup
edisown
pode-se dizer que ambos suprimemSIGHUP
, mas de maneiras diferentes.nohup
faz com que o programa ignore o sinal inicialmente (o programa pode mudar isso).nohup
também tenta providenciar para que o programa não tenha um terminal de controle, para que ele não seja enviadoSIGHUP
pelo kernel quando o terminal estiver fechado.disown
é puramente interno à concha; faz com que o shell não seja enviadoSIGHUP
quando terminar.disown
remoção do trabalho da lista de trabalhos. Se você não especificar uma opção, ela a removerá da lista de trabalhos. No entanto , se você especificar a-h
opção, cada jobpec não será removido da tabela. Em vez disso, ele faz com queSIGHUP
não seja enviado para o trabalho se o shell receber umSIGHUP
.&
não fornece um terminal, ele se desconectastdin
do processo e faz com que seja executado em segundo plano, mas ambosstdout
estderr
ainda está anexado ao tty atual. Isso significa que você pode misturar textos de diferentes programas, o que pode ser bastante irritante se você o fizergimp &
e receber muitos erros de GTK + ao tentar usar esse tty para outra coisa.Aqui está minha experiência tentando executar o soffice em segundo plano, seguindo um comando não-finalizável (por exemplo
tail
). Neste exemplo, usareisleep 100
.&
nohup .. &
e renegar
setsid .. &
Para economizar espaço::
nohup setsid ..
não mostra logs / soffice NÃO PARA Ctrl-Cnohup
com& disown
no final: não mostra logs / soffice Ctrl-Cfonte
nohup ⟨command⟩ & disown
o processo criado não páraCtrl+C
.soffice
?soffice
comando parece ter algo diferente. Por isso, considerei adicioná-lo aqui como uma exceção de regra. por exemplo, ao usar :,nohup .. &
pressionarCtrl-c
normalmente não faz com que o comando seja interrompido, mas comsoffice
ele. Eu espero até que alguém pisa sobre isso e explica por que isso acontece com soffice :)nohup soffice &
e aperteiCtrl+C
. Nada aconteceu, como esperado.