Alguém poderia explicar se e por que disown
é necessário se você deseja manter um trabalho em execução mesmo depois de desconectar.
Eu pergunto porque todos os sites que visitei dizem para usar disown
e, bg
por bg
si só, estão funcionando para mim e não sei por quê.
É porque não entendi completamente para que disown
serve ou há algumas configurações em algum lugar que estão afetando o comportamento padrão do bg
comando?
Aqui está o que eu fiz:
- Conectado à minha caixa CentOS 6 via SSH
Criou um processo simples:
tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
Suspendeu o trabalho
- Retomei em segundo plano via
bg 1
- Desconectado do servidor SSH
Em seguida, verifiquei via FTP para ver se o .tar.gz
arquivo ainda estava aumentando de tamanho e estava.
Responder1
Os processos em segundo plano bg
ou &
normalmente morrerão em 2 cenários:
- O shell recebe um SIGHUP
- Eles tentam escrever em um terminal que não existe mais.
O item nº 1 é o principal culpado ao fechar seu terminal. No entanto, se isso acontece ou não dependecomovocê fecha seu terminal. Você pode fechá-lo:
- Algo como clicar no "X" no seu gerenciador de janelas
- Você pode digitar
exit
,logout
ou CTRL+ D.
O item nº 1 é aquele que resultará no envio de um SIGHUP. # 2 não.
Resumindo a história, se você colocar em segundo plano um processo com bg
e depois sair com exit
, logout
ou CTRL+ D, o processo não será eliminado.
Responder2
Quando você fecha um terminal, todos os processos que utilizam este terminal (veja TTY
a coluna na ps -elf
saída) recebem um arquivo SIGHUP
. Cabe a processar o que fazer em SIGHUP
. Em unixes clássicos (AIX, Solaris), os processos são fechados neste sinal. É por isso que você precisa usar disown
. De man bash
:
O shell é encerrado por padrão após o recebimento de um SIGHUP. Antes de sair, um shell interativo reenvia o SIGHUP para todos os trabalhos, em execução ou parados. Os trabalhos interrompidos recebem SIGCONT para garantir que recebam o SIGHUP. Para evitar que o shell envie o sinal para um trabalho específico, ele deve ser removido da tabela de trabalhos com o disown embutido (veja COMANDOS BUILTIN DO SHELL abaixo) ou marcado para não receber SIGHUP usando disown -h.