nohup, disown e screen: Mantendo Processos em Execução Após o Logout
O Que Você Vai Aprender
- Por que processos morrem quando você fecha o terminal ou a sessão SSH
- Como usar
nohup,disownescreenpara manter processos vivos após o logout - Quando usar cada ferramenta
Referência Rápida
| Situação | Ferramenta |
|---|---|
| Iniciar um comando que sobrevive ao logout | nohup cmd & |
| Desanexar um job já em execução | disown %1 |
| Manter uma sessão completa e reconectar depois | screen ou tmux |
Por Que Processos Morrem Quando Você Faz Logout?
Quando você fecha um terminal ou perde uma conexão SSH, o shell envia SIGHUP (Signal 1: Hangup) para cada processo em sua tabela de jobs. O handler padrão de sinal encerra o processo, então jobs em background morrem junto com o shell.
$ sleep 300 & [1] 12345 $ exit # shell encerra → SIGHUP enviado ao sleep → PID 12345 termina
As três 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 começo.
$ nohup long-job.sh &
&é opcional mas idiomático — execução em background é a intenção usual- STDOUT e STDERR são automaticamente redirecionados para
nohup.outno diretório atual - Especifique um arquivo de log personalizado para evitar que
nohup.outcresca indefinidamente:
$ nohup ./deploy.sh > /var/log/deploy.log 2>&1 &
Descarte a saída totalmente quando não precisar dela:
$ nohup ./job.sh > /dev/null 2>&1 &
nohup apenas bloqueia SIGHUP — ele não daemoniza completamente o processo. Após o shell encerrar, o processo continua vivo mas é reparentado para init (PID 1).
disown — Use Após Iniciar
disown remove um job da tabela de jobs do shell para que SIGHUP não 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 não receber SIGHUP sem removê-lo da lista de jobs — você ainda pode vê-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 Sessão Inteira
screen é um multiplexador de terminal que virtualiza toda a sessão do terminal. O recurso principal é desanexar e reconectar — desconecte, feche seu laptop, reconecte de outra máquina e encontre sua sessão 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
| Ação | Tecla |
|---|---|
| Desanexar | Ctrl+A D |
| Nova janela | Ctrl+A C |
| Próxima janela | Ctrl+A N |
| Janela anterior | Ctrl+A P |
| Encerrar sessão | exit na última janela |
screen vs tmux
tmux oferece mais recursos e um sistema de configuração mais flexível. Se tmux está disponível no seu servidor, prefira-o. Veja Introdução ao tmux para uma comparação. Use screen quando tmux não estiver disponível ou você quiser a configuração mais simples possível.
Escolhendo a Ferramenta Certa
| Ferramenta | Quando | Observações |
|---|---|---|
nohup cmd & |
Antes de iniciar | Simples, integrado, saída vai para nohup.out |
disown |
Após iniciar | Esqueceu nohup — sem arquivo de log criado automaticamente |
screen / tmux |
Ambos | Desanexar/reconectar, múltiplas janelas, compartilhamento de sessão |
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 — você encerrou a sessão; useCtrl+A Dpara desanexar - Deixar
nohup.outcrescer sem limite — sempre especifique um caminho de log ou redirecione para/dev/null