Comando nohup: como usar, nohup.out e manter a execução depois de fechar o terminal
Para que uma tarefa continue rodando mesmo se você fechar o terminal ou a conexão SSH cair, execute-a com o comando nohup. O nohup executa o comando fazendo com que ele ignore o sinal de desconexão (SIGHUP) que chega quando o terminal é fechado. Quando um sleep com nohup e outro sem nohup foram iniciados juntos em um servidor AlmaLinux 9 e o terminal foi fechado, só o iniciado com nohup continuou rodando.
A saída abaixo vem de um servidor AlmaLinux 9.8 (conta root) e de um servidor Debian 12 (conta comum). No lugar de uma tarefa longa foi iniciado um sleep, e para encerrá-lo foi indicado só o PID recebido ao iniciar. Os horários estão em UTC.
1️⃣ Como usar o comando nohup
O nohup vai antes do comando a executar, e o & no final do comando define a execução em segundo plano. Segundo o manual oficial do GNU, o nohup em si não manda o comando para segundo plano, então sem o & o prompt só volta quando o comando termina.
nohup sleep 300 &[1] 3431609
nohup: ignoring input and appending output to 'nohup.out'[1] é o número da tarefa e 3431609 é o PID do processo iniciado. A mensagem que veio em seguida avisa que a entrada do teclado não será lida e que a saída será acrescentada ao arquivo nohup.out.
O PID da tarefa que você acabou de iniciar fica em $!. Confira com [echo $!] logo depois de iniciar e anote: esse mesmo número serve para ver o estado ou para encerrar a tarefa.
echo $!3431609Quando o terminal é fechado, o shell recebe o sinal de desconexão e manda o mesmo sinal para as tarefas que iniciou (segundo o manual oficial do Bash). Para conferir isso, em um terminal novo foram iniciados juntos [nohup sleep 300 &] e, sem nohup, [sleep 301 &].
sleep 301 &[2] 3432892jobs -l[1]- 3432883 Running nohup sleep 300 &
[2]+ 3432892 Running sleep 301 &Com as duas tarefas em Running, a janela do terminal foi fechada e os dois PIDs foram conferidos com ps a partir de outro shell.
ps -p 3432883,3432892 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3432883 S 00:05 sleep 300Só sobrou o sleep 300, iniciado com nohup; o sleep 301, iniciado sem nohup, terminou junto com o fechamento do terminal.
Um processo iniciado com nohup é como um celular no modo Não perturbe.
O nohup é um comando do pacote coreutils. A versão instalada aparece na primeira linha do --version. O servidor AlmaLinux 9.8 tinha a 8.32 e o servidor Debian 12, a 9.1.
nohup --version | head -1nohup (GNU coreutils) 8.32nohup --version | head -1nohup (GNU coreutils) 9.12️⃣ nohup.out e redirecionamento da saída
Se você não definir para onde vai a saída, o nohup acrescenta a saída do comando ao nohup.out da pasta atual. O nohup.out recém-criado tinha 0 byte e permissões -rw-------, de leitura e escrita só para o usuário que o criou.
ls -l nohup.out-rw------- 1 root root 0 Oct 28 23:04 nohup.outO manual oficial do GNU explica que o nohup cria o nohup.out de modo que só o usuário que o criou possa ler e gravar nele, independentemente da configuração de umask. Se não conseguir gravar na pasta atual, grava em $HOME/nohup.out na pasta pessoal, e se também não conseguir gravar lá, não executa o comando.
Quando um comando com saída foi executado com nohup, a saída ficou no nohup.out depois que o comando terminou.
nohup sh -c 'echo start; sleep 2; echo end' &[1] 3431985
nohup: ignoring input and appending output to 'nohup.out'cat nohup.outstart
end
[1]+ Done nohup sh -c 'echo start; sleep 2; echo end'O Done da última linha é o aviso do shell de que a tarefa terminou. O nohup.out não é criado de novo a cada execução, e sim continuado no final do mesmo arquivo; por isso, se você iniciar várias tarefas na mesma pasta, as saídas se misturam em um só arquivo.
Para separar o log de cada tarefa, defina o arquivo de saída com > e mande também a saída de erro para o mesmo arquivo com 2>&1.
nohup sh -c 'echo start; sleep 300' > job.log 2>&1 &[1] 3432059cat job.lognohup: ignoring input
startCom o 2>&1 junto, o terminal mostrou só o número da tarefa e o PID, e o aviso do nohup [nohup: ignoring input] foi gravado na primeira linha do arquivo de log.
Se você colocar só o > e tirar o 2>&1, aparece no terminal um aviso de que a saída de erro está sendo redirecionada para o arquivo da saída padrão.
nohup sleep 300 > job2.log &[2] 3432097
nohup: ignoring input and redirecting stderr to stdoutA saída de tarefas que você não precisa guardar vai para /dev/null. Nesse caso também, o terminal mostrou só o número da tarefa e o PID.
nohup sleep 300 > /dev/null 2>&1 &[3] 3432137A tabela abaixo mostra, para as quatro formas de execução, para onde foi a saída e qual mensagem apareceu no terminal.
| Forma de execução | Para onde vai a saída | Mensagem no terminal |
|---|---|---|
| nohup comando & | nohup.out da pasta atual | nohup: ignoring input and appending output to 'nohup.out' |
| nohup comando > arquivo & | Arquivo indicado (com a saída de erro) | nohup: ignoring input and redirecting stderr to stdout |
| nohup comando > arquivo 2>&1 & | Arquivo indicado | Nenhuma (o aviso fica na primeira linha do arquivo) |
| nohup comando > /dev/null 2>&1 & | Descartada | Nenhum |
3️⃣ Verificar e encerrar processos nohup
A lista do jobs mostra só as tarefas iniciadas no shell atual; por isso, depois de fechar o terminal e se conectar de novo, confira o processo nohup com ps -p indicando o PID. Enquanto estiver no mesmo shell, jobs -l mostra juntos o número da tarefa, o PID e o estado.
jobs -l[1]+ 3431609 Running nohup sleep 300 &Se você colocar um PID depois de ps -p e escolher as colunas com -o, aparece só a linha desse processo. O S em STAT indica que ele está dormindo à espera de um evento, e ELAPSED é o tempo desde que começou.
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3431609 S 00:03 sleep 300Para encerrar, use kill seguido do PID.
kill 3431609O kill não mostrou nada e, ao rodar jobs em seguida, a tarefa apareceu como Terminated e depois saiu da lista.
jobs[1]+ Terminated nohup sleep 300Ao rodar ps de novo com o mesmo PID, apareceu só o cabeçalho, o que confirmou que o processo tinha terminado.
ps -p 3431609 -o pid,stat,etime,cmd PID STAT ELAPSED CMDO nohup ignora só o sinal de desconexão, então mandar esse mesmo sinal diretamente com [kill -HUP] não encerra o processo. O kill -HUP foi enviado ao sleep 305, iniciado com nohup, e ao sleep 306, iniciado sem nohup.
kill -HUP 3437119 3437128Na verificação seguinte com jobs -l, só o do nohup continuou em Running, e o sleep 306 terminou com Hangup.
jobs -l[1]- 3437119 Running nohup sleep 305 &
[2]+ 3437128 Hangup sleep 306Se você não indicar um sinal ao kill, ele envia SIGTERM; por isso uma tarefa iniciada com nohup também termina com [kill PID].
4️⃣ Comando nohup comparado ao disown e opções
🔲 nohup comparado ao disown
O disown é um comando interno do bash usado em tarefas já iniciadas: serve para desligar depois, do sinal de desconexão do terminal, uma tarefa iniciada com & mas sem nohup. O disown não redireciona a saída para o nohup.out; por isso, em tarefas com saída, defina para onde ela vai com > arquivo ao iniciar.
Segundo o manual oficial do Bash, o disown sem opções tira a tarefa da lista do jobs, enquanto o disown -h a mantém na lista e só impede que o sinal de desconexão chegue a ela. Primeiro foi iniciado o sleep 302 e depois executado o disown.
sleep 302 &[1] 3433230disownO disown não mostrou nada, e o jobs -l executado logo em seguida também deu resultado vazio.
jobs -lEm seguida foi iniciado o sleep 303 e executado disown -h no número de tarefa %1.
sleep 303 &[1] 3433343disown -h %1Ao conferir com jobs -l, a tarefa continuava na lista.
jobs -l[1]+ 3433343 Running sleep 303 &Foi iniciado ainda mais um sleep 304, sem nenhum tratamento, o terminal foi fechado e os três PIDs foram conferidos a partir de outro shell.
sleep 304 &[2] 3433474ps -p 3433230,3433343,3433474 -o pid,stat,etime,cmd PID STAT ELAPSED CMD
3433230 S 00:11 sleep 302
3433343 S 00:08 sleep 303As duas tarefas com disown e disown -h ficaram, e só o sleep 304, sem tratamento, terminou. Comparando os quatro métodos:
| Método | Quando usar | Lista do jobs | Depois de fechar o terminal | Saída |
|---|---|---|---|---|
| nohup comando & | Ao iniciar | Fica | Fica | nohup.out ou arquivo indicado |
| comando & e depois disown | Depois de iniciar | Pulada | Fica | Não muda |
| comando & e depois disown -h | Depois de iniciar | Fica | Fica | Não muda |
| Só comando & | — | Fica | Encerrado | Não muda |
Para trabalhos em que você precisa trazer a tela da sessão de volta e continuar digitando, o certo é um multiplexador de terminal como o tmux; para trabalhos que você inicia uma vez e dos quais só recebe o resultado em um arquivo, o nohup basta.
🔲 Opções do comando nohup
📌 Principais opções: resultados deste artigo
| Opção | Tarefa | Resultado neste artigo | |
|---|---|---|---|
| --version | Mostra as informações de versão e sai | Servidor AlmaLinux 9.8: nohup (GNU coreutils) 8.32; servidor Debian 12: nohup (GNU coreutils) 9.1 |
📎 Outras opções: segundo o manual oficial
| Opção | Tarefa | |
|---|---|---|
| --help | Mostra a ajuda e sai |
🔲 Simulador do comando nohup
No simulador abaixo, você pode iniciar uma tarefa com nohup, fechar o terminal e se reconectar com o chip 🔌 e ver por conta própria quais processos ficam.
🔢 FAQ & conteúdo recomendado
Agendamento
Linux: configuração do crontab
Configuração do crontab, o agendador do Linux que registra tarefas para repetir em horários fixos, como backups ou limpeza de logs.
Processos
Comando top do Linux (ver uso de CPU e memória)
O comando top, que mostra em tempo real o uso de CPU e memória de cada processo.
ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.