Ubuntu Jobs, nohup e tmux

Um comando demorado, como uma cópia grande ou um download, "prende" o terminal até terminar. Nesta aula você vai aprender a mandar comandos para o segundo plano, trazê-los de volta e, principalmente, mantê-los rodando depois de fechar o terminal ou perder a conexão SSH.

Você vai aprender
  • A diferença entre primeiro plano e segundo plano.
  • Usar &, Ctrl+Z, jobs, bg e fg.
  • Por que fechar o terminal mata os programas que ele abriu, e como evitar isso com nohup e disown.
  • Usar o tmux para deixar uma sessão inteira rodando num servidor.
  • Qual ferramenta escolher em cada situação.

Antes do comando: primeiro e segundo plano

Quando você digita um comando, ele roda em primeiro plano (foreground): o terminal fica ocupado, mostra a saída e só devolve o prompt quando o comando termina. Você pode interromper com Ctrl+C.

Um comando em segundo plano (background) roda "por trás". O prompt volta na hora e você pode continuar digitando.

Cada comando que o terminal controla assim é um job ("trabalho"). Os jobs pertencem àquela janela de terminal: outra janela não os enxerga.

Para os exemplos, vamos usar o sleep, que só espera: sleep 300 fica 300 segundos parado. É perfeito para treinar, porque não faz nada.


Rodar em segundo plano: &

sleep 300
O comando que vai rodar.
&
No fim da linha: "rode em segundo plano e me devolva o prompt".
$ sleep 300 &
[1] 4210                    « [1] = número do job; 4210 = PID do processo
$ echo "o terminal está livre"
o terminal está livre

O shell responde com dois números: o número do job entre colchetes, usado nos comandos desta página, e o PID, o número do processo no sistema inteiro, usado por kill e ps (veja ps, pgrep, top).

Ver os jobs: jobs

$ sleep 200 &
[2] 4215
$ jobs
[1]-  Executando                 sleep 300 &
[2]+  Executando                 sleep 200 &      « + é o job "atual"
$ jobs -l
[1]- 4210 Executando                 sleep 300 &   « -l mostra o PID também
[2]+ 4215 Executando                 sleep 200 &
SinalSignificado
+Job atual: o que fg e bg usam se você não disser qual
-O anterior
ExecutandoRodando em segundo plano
ParadoPausado (com Ctrl+Z)
Concluído / TerminadoAcabou sozinho / foi encerrado

Quando um job de segundo plano termina, o shell avisa na próxima vez que mostrar o prompt:

$ sleep 2 &
[3] 4230
$ ls
Documentos  Downloads
[3]   Concluído                  sleep 2
Atenção à saída

Um comando em segundo plano continua escrevendo no seu terminal, misturando com o que você digita. Para comandos que falam muito, mande a saída para um arquivo: comando > saida.log 2>&1 &.


Pausar e retomar: Ctrl+Z, bg e fg

Esqueceu o &? Não precisa cancelar. Pause com Ctrl+Z e escolha:

$ cp -r Videos/ /media/ana/HD/
^Z                                              « você apertou Ctrl+Z
[1]+  Parado                     cp -r Videos/ /media/ana/HD/
$ bg                                            « continue, mas em segundo plano
[1]+ cp -r Videos/ /media/ana/HD/ &
$ jobs
[1]+  Executando                 cp -r Videos/ /media/ana/HD/ &
$ fg                                            « traga de volta para o primeiro plano
cp -r Videos/ /media/ana/HD/
ComandoOrigemO que faz
Ctrl+Z—Pausa o job em primeiro plano (ele fica Parado)
bgbackgroundContinua o job pausado em segundo plano
fgforegroundTraz o job para o primeiro plano
fg %2—Traz o job número 2 (o % indica número de job)
kill %1—Encerra o job 1 (sem precisar do PID)
Ctrl+Z não é Ctrl+C

Ctrl+C cancela o comando. Ctrl+Z só pausa: o programa continua na memória, parado. Se você sair do terminal com jobs parados, o bash avisa: Há trabalhos parados.

O que o comando devolve

$ fg %5
bash: fg: %5: trabalho não existe
$ echo $?
1

Fechar o terminal mata os jobs

Ao fechar a janela do terminal ou perder a conexão SSH, o sistema manda o sinal SIGHUP (hang up, "desligar o telefone") para os programas daquele terminal. A maioria encerra ao recebê-lo. Por isso, um download em segundo plano morre quando você fecha a janela.

Há três formas de evitar isso:

Forma 1: nohup (antes de começar)

nohup
De no hang up: roda o comando ignorando o SIGHUP.
./backup.sh
O comando que deve sobreviver.
&
Em segundo plano, para liberar o terminal.
$ nohup ./backup.sh &
[1] 4302
nohup: ignoring input and appending output to 'nohup.out'   « a saída vai para um arquivo
$ tail -f nohup.out                                          « acompanhe quando quiser

A mensagem do nohup vem em inglês no Ubuntu 26.04. Ela diz: "ignorando a entrada e acrescentando a saída em nohup.out". Para escolher o arquivo, redirecione: nohup ./backup.sh > backup.log 2>&1 &.

Forma 2: disown (já começou)

O job já está rodando e você precisa fechar o terminal? O disown tira o job da lista do shell, e ele deixa de receber o SIGHUP:

$ ./backup.sh &
[1] 4310
$ disown %1
$ jobs                          « não aparece mais aqui, mas continua rodando
$ pgrep -a backup
4310 /bin/bash ./backup.sh

Se o job estava pausado, rode bg antes do disown. Um job pausado continua pausado para sempre.

Forma 3: tmux (o mais completo)

O nohup e o disown salvam o processo, mas você perde a "tela" dele: não dá mais para interagir. O tmux (de terminal multiplexer) cria um terminal que continua existindo no servidor mesmo quando você se desconecta. Depois, você volta e encontra tudo exatamente como deixou.


tmux passo a passo

O tmux não vem instalado no Ubuntu Desktop. No Ubuntu Server, normalmente sim.

  1. Instalar.
    $ sudo apt install tmux
  2. Criar uma sessão com nome.
    tmux
    O programa.
    new
    Criar uma sessão nova.
    -s backup
    De session name: o nome da sessão.
    $ tmux new -s backup

    A tela limpa e aparece uma barra verde embaixo. Você está dentro do tmux. Rode o que quiser, por exemplo ./backup.sh.

  3. Desanexar (sair sem encerrar). Aperte Ctrl+B, solte, e aperte D. Você volta ao terminal normal; a sessão continua rodando.
    $ tmux new -s backup
    [detached (from session backup)]           « depois de Ctrl+B e D
  4. Pode fechar o terminal ou desconectar o SSH. O backup continua.
  5. Listar e voltar.
    $ tmux ls
    backup: 1 windows (created Thu Oct 15 10:30:00 2026)
    $ tmux attach -t backup                    « volta para dentro da sessão
  6. Encerrar de vez. Dentro da sessão, digite exit. De fora: tmux kill-session -t backup.

Atalhos do tmux

Todos começam com o prefixo Ctrl+B: aperte, solte, e depois a tecla da tabela.

AtalhoO que faz
Ctrl+B DDesanexa (sai e deixa rodando)
Ctrl+B CCria uma nova janela
Ctrl+B N / PPróxima / janela anterior
Ctrl+B 0…9Vai para a janela de número tal
Ctrl+B %Divide a tela lado a lado
Ctrl+B "Divide a tela em cima e embaixo
Ctrl+B setasMuda de painel
Ctrl+B [Modo de rolagem (setas/PgUp; Q sai)
Ctrl+B ?Lista todos os atalhos
E o screen?

O screen é um programa mais antigo que faz o mesmo. Se você o encontrar num servidor: screen -S nome cria, Ctrl+A D desanexa, screen -ls lista e screen -r nome volta.


Qual usar?

SituaçãoUse
Liberar o terminal por alguns minutoscomando &
Esqueci o &Ctrl+Z e bg
Vou fechar o terminal; o comando nem começounohup comando > log 2>&1 &
Vou fechar o terminal; o comando já está rodandobg + disown
Tarefa longa num servidor por SSH, que eu quero acompanhartmux
Programa que deve rodar sempre, inclusive depois de reiniciarUm serviço do systemd (veja Criar um Serviço)

Quando não funciona

"trabalho não existe"
$ fg %3
bash: fg: %3: trabalho não existe

O que aconteceu: não há job 3 nesta janela. Jobs só existem no terminal que os criou; ou o job já terminou.

Como resolver: rode jobs para ver os números. Se o processo foi aberto em outra janela, procure pelo PID com pgrep -a nome.

O download parou quando fechei o terminal

O que aconteceu: o job recebeu SIGHUP e encerrou. O & sozinho não protege contra isso.

Como resolver: da próxima vez, use nohup, disown ou tmux. Muitos programas continuam de onde pararam: wget -c URL retoma downloads, e o rsync só copia o que falta.

"sessions should be nested with care"
$ tmux new -s outra
sessions should be nested with care, unset $TMUX to force

O que aconteceu: você já está dentro de uma sessão tmux e tentou abrir outra dentro dela.

Como resolver: desanexe (Ctrl+B D) antes, ou crie uma janela nova com Ctrl+B C.

"no sessions" / "can't find session"
$ tmux attach -t backup
can't find session: backup

O que aconteceu: a sessão foi encerrada (alguém digitou exit, ou o servidor reiniciou: o tmux não sobrevive a um reboot).

Como resolver: rode tmux ls para ver o que existe. Para algo que precise voltar sozinho depois de reiniciar, crie um serviço.


Referência

ComandoO que faz
comando &Roda em segundo plano
jobs / jobs -lLista os jobs (com PID)
Ctrl+ZPausa o job em primeiro plano
bg [%n]Continua em segundo plano
fg [%n]Traz para o primeiro plano
kill %nEncerra o job n
nohup comando &Roda ignorando o SIGHUP (saída em nohup.out)
disown [%n]Desliga o job do terminal
tmux new -s nomeCria sessão tmux
tmux lsLista sessões
tmux attach -t nomeVolta para uma sessão
tmux kill-session -t nomeEncerra uma sessão

Exercícios

1. Segundo plano

Complete para rodar sleep 600 em segundo plano:

sleep 600

2. Trazer de volta

Complete para trazer o job número 2 para o primeiro plano:

3. Voltar à sessão do tmux

Complete para voltar à sessão tmux chamada deploy:

tmux

4. Você apertou Ctrl+Z num comando. O que aconteceu com ele?

5. Você vai rodar um backup de 3 horas num servidor por SSH e quer poder acompanhar o andamento depois. Qual a melhor escolha?


Resumo

  • & manda para o segundo plano; jobs lista; fg/bg alternam; Ctrl+Z pausa.
  • Jobs pertencem à janela de terminal que os criou.
  • Fechar o terminal envia SIGHUP e mata os jobs. Proteja com nohup (antes) ou disown (depois).
  • tmux mantém uma sessão inteira viva no servidor: Ctrl+B D para sair, tmux attach -t nome para voltar.
  • O que precisa sobreviver a um reboot vira serviço do systemd.