nohup, disown e screen: Mantendo Processos em Execucao Apos o Logout
O Que Voce Vai Aprender
- Por que processos morrem quando voce fecha o terminal ou a sessao SSH
- Como usar
nohup,disownescreenpara manter processos vivos apos o logout - Quando usar cada ferramenta
Referencia Rapida
| Situacao | Ferramenta |
|---|---|
| Iniciar um comando que sobrevive ao logout | nohup cmd & |
| Desanexar um job ja em execucao | disown %1 |
| Manter uma sessao completa e reconectar depois | screen ou tmux |
Por Que Processos Morrem Quando Voce Faz Logout?
Quando voce fecha um terminal ou perde uma conexao SSH, o shell envia SIGHUP (Signal 1: Hangup) para cada processo em sua tabela de jobs. O handler padrao de sinal encerra o processo, entao jobs em background morrem junto com o shell.
$ sleep 300 & [1] 12345 $ exit # shell encerra → SIGHUP enviado ao sleep → PID 12345 termina
As tres ferramentas abaixo cortam o caminho de entrega do SIGHUP em camadas diferentes.
nohup — Use Antes de Iniciar
nohup ("no hangup") inicia um comando com SIGHUP ignorado desde o comeco.
$ nohup long-job.sh &
&e opcional mas idiomatico — execucao em background e a intencao usual- STDOUT e STDERR sao automaticamente redirecionados para
nohup.outno diretorio atual - Especifique um arquivo de log personalizado para evitar que
nohup.outcresca indefinidamente:
$ nohup ./deploy.sh > /var/log/deploy.log 2>&1 &
Descarte a saida totalmente quando nao precisar dela:
$ nohup ./job.sh > /dev/null 2>&1 &
nohup apenas bloqueia SIGHUP — ele nao daemoniza completamente o processo. Apos o shell encerrar, o processo continua vivo mas e reparentado para init (PID 1).
disown — Use Apos Iniciar
disown remove um job da tabela de jobs do shell para que SIGHUP nao seja mais entregue quando o shell encerrar. Use quando esqueceu de prefixar com nohup.
# Verificar jobs em execucao $ jobs [1]+ Running long-job.sh & # Remover job 1 da tabela de jobs $ disown %1 # Remover todos os jobs $ disown -a
disown -h marca o job para nao receber SIGHUP sem remove-lo da lista de jobs — voce ainda pode ve-lo com jobs.
$ disown -h %1
Recuperando Quando Esqueceu do nohup
# 1. Se o job esta em foreground, suspenda-o primeiro Ctrl+Z [1]+ Stopped ./deploy.sh # 2. Retome em background $ bg %1 [1]+ ./deploy.sh & # 3. Corte a entrega do SIGHUP $ disown %1 # 4. Seguro fechar o terminal
screen — Persistir a Sessao Inteira
screen e um multiplexador de terminal que virtualiza toda a sessao do terminal. O recurso principal e desanexar e reconectar — desconecte, feche seu laptop, reconecte de outra maquina e encontre sua sessao exatamente onde a deixou.
# Criar uma sessao nomeada e entrar nela $ screen -S mysession # Faca seu trabalho dentro do screen # Desanexar sem encerrar (screen continua vivo em background) Ctrl+A D # Reconectar de outro terminal ou sessao SSH $ screen -r mysession # Listar todas as sessoes $ screen -ls
Atalhos Comuns do screen
| Acao | Tecla |
|---|---|
| Desanexar | Ctrl+A D |
| Nova janela | Ctrl+A C |
| Proxima janela | Ctrl+A N |
| Janela anterior | Ctrl+A P |
| Encerrar sessao | exit na ultima janela |
screen vs tmux
tmux oferece mais recursos e um sistema de configuracao mais flexivel. Se tmux esta disponivel no seu servidor, prefira-o. Veja Introducao ao tmux para uma comparacao. Use screen quando tmux nao estiver disponivel ou voce quiser a configuracao mais simples possivel.
Escolhendo a Ferramenta Certa
| Ferramenta | Quando | Observacoes |
|---|---|---|
nohup cmd & |
Antes de iniciar | Simples, integrado, saida vai para nohup.out |
disown |
Apos iniciar | Esqueceu nohup — sem arquivo de log criado automaticamente |
screen / tmux |
Ambos | Desanexar/reconectar, multiplas janelas, compartilhamento de sessao |
Erros comuns a evitar
- Executar um job em background sem
nohupe depois fechar o terminal — SIGHUP o encerra - Pressionar
Ctrl+Ddentro de uma janelascreenpensando que "fechou" o screen — voce encerrou a sessao; useCtrl+A Dpara desanexar - Deixar
nohup.outcrescer sem limite — sempre especifique um caminho de log ou redirecione para/dev/null