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.
- A diferença entre primeiro plano e segundo plano.
- Usar
&, Ctrl+Z,jobs,bgefg. - Por que fechar o terminal mata os programas que ele abriu, e como evitar isso com
nohupedisown. - Usar o
tmuxpara 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 &
| Sinal | Significado |
|---|---|
+ | Job atual: o que fg e bg usam se você não disser qual |
- | O anterior |
Executando | Rodando em segundo plano |
Parado | Pausado (com Ctrl+Z) |
Concluído / Terminado | Acabou 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
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/
| Comando | Origem | O que faz |
|---|---|---|
| Ctrl+Z | — | Pausa o job em primeiro plano (ele fica Parado) |
bg | background | Continua o job pausado em segundo plano |
fg | foreground | Traz 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+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.
- Instalar.
$ sudo apt install tmux
- 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. - 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
- Pode fechar o terminal ou desconectar o SSH. O backup continua.
- 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
- 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.
| Atalho | O que faz |
|---|---|
| Ctrl+B D | Desanexa (sai e deixa rodando) |
| Ctrl+B C | Cria uma nova janela |
| Ctrl+B N / P | Próxima / janela anterior |
| Ctrl+B 0…9 | Vai 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 setas | Muda de painel |
| Ctrl+B [ | Modo de rolagem (setas/PgUp; Q sai) |
| Ctrl+B ? | Lista todos os atalhos |
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ção | Use |
|---|---|
| Liberar o terminal por alguns minutos | comando & |
Esqueci o & | Ctrl+Z e bg |
| Vou fechar o terminal; o comando nem começou | nohup comando > log 2>&1 & |
| Vou fechar o terminal; o comando já está rodando | bg + disown |
| Tarefa longa num servidor por SSH, que eu quero acompanhar | tmux |
| Programa que deve rodar sempre, inclusive depois de reiniciar | Um serviço do systemd (veja Criar um Serviço) |
Quando não funciona
$ 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 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.
$ 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.
$ 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
| Comando | O que faz |
|---|---|
comando & | Roda em segundo plano |
jobs / jobs -l | Lista os jobs (com PID) |
| Ctrl+Z | Pausa o job em primeiro plano |
bg [%n] | Continua em segundo plano |
fg [%n] | Traz para o primeiro plano |
kill %n | Encerra o job n |
nohup comando & | Roda ignorando o SIGHUP (saída em nohup.out) |
disown [%n] | Desliga o job do terminal |
tmux new -s nome | Cria sessão tmux |
tmux ls | Lista sessões |
tmux attach -t nome | Volta para uma sessão |
tmux kill-session -t nome | Encerra uma sessão |
Exercícios
1. Segundo plano
Complete para rodar sleep 600 em segundo plano:
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:
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;jobslista;fg/bgalternam; Ctrl+Z pausa.- Jobs pertencem à janela de terminal que os criou.
- Fechar o terminal envia SIGHUP e mata os jobs. Proteja com
nohup(antes) oudisown(depois). tmuxmantém uma sessão inteira viva no servidor: Ctrl+B D para sair,tmux attach -t nomepara voltar.- O que precisa sobreviver a um reboot vira serviço do systemd.