Tmux: sessões persistentes para organizar o terminal

O terminal costuma começar simples: uma janela, um prompt e o comando que precisamos executar. O problema aparece quando o trabalho cresce. Uma tarefa fica rodando em uma aba, o editor em outra, os logs em uma terceira e, de repente, há várias janelas abertas apenas para tentar manter o contexto organizado.
É nesse cenário que o tmux se torna útil. Ele não é um novo terminal nem um shell; é um multiplexador de terminal que permite manter sessões, janelas e painéis dentro de uma única conexão.
O que é o tmux?
O tmux cria uma camada entre o terminal e os programas que estão sendo executados. Em vez de cada programa depender diretamente da janela do emulador de terminal, ele passa a ser executado dentro de uma sessão administrada pelo tmux.
Essa separação tem uma consequência importante: fechar a janela do terminal ou perder a conexão SSH não precisa encerrar o trabalho. A sessão continua ativa no servidor e pode ser retomada depois.
Sessões, janelas e painéis
Esses três conceitos formam a organização do tmux:
- Sessão: um ambiente de trabalho completo. Posso ter uma sessão para um projeto, outra para administração de um servidor e outra para uma tarefa longa.
- Janela: uma aba dentro da sessão. Cada janela pode ter um propósito diferente, como editor, shell ou monitoramento.
- Painel: uma divisão dentro da janela. É possível deixar o editor em um painel, os testes em outro e os logs em um terceiro.
Uma organização típica no meu caso é manter uma janela para editar arquivos, outra para executar comandos e uma terceira para acompanhar processos ou logs. Isso reduz a necessidade de abrir várias janelas do emulador e torna mais fácil retornar ao trabalho.
O recurso que mais importa: persistência
O tmux é especialmente interessante em conexões SSH. Sem ele, uma queda de rede ou o fechamento acidental do terminal pode interromper um processo que estava sendo executado remotamente. Com ele, a sessão permanece no servidor:
terminal local -> SSH -> sessão tmux no servidorSe a conexão cair, basta conectar novamente e anexar a sessão existente. O processo continua no ponto em que estava, desde que ele tenha sido iniciado dentro do tmux.
tmux new -s projeto
tmux ls
tmux attach -t projetoO primeiro comando cria uma sessão chamada projeto. O segundo lista as sessões disponíveis e o terceiro reabre uma sessão já existente. Para sair da sessão sem encerrar os programas, uso o prefixo seguido de d (Ctrl+a d na minha configuração).
Atalhos básicos
Por padrão, o prefixo do tmux é Ctrl+b. O prefixo é a tecla que informa ao tmux que o próximo comando deve ser interpretado por ele, e não pelo shell. Alguns atalhos importantes são:
| Ação | Atalho padrão |
|---|---|
| Criar uma janela | Ctrl+b c |
| Dividir lado a lado | Ctrl+b % |
| Dividir na horizontal | Ctrl+b " |
| Alternar entre janelas | Ctrl+b n ou Ctrl+b p |
| Listar sessões | Ctrl+b s |
| Desanexar da sessão | Ctrl+b d |
Os atalhos ficam mais naturais com o tempo. No começo, é melhor aprender poucos comandos e usá-los todos os dias do que tentar decorar a lista inteira de uma vez.
Como eu utilizo
Na minha máquina local, alterei o prefixo para Ctrl+a. A escolha tem um motivo prático: mantenho o prefixo padrão Ctrl+b para as conexões remotas que não usam a mesma configuração. Assim consigo distinguir rapidamente se estou controlando o tmux local ou o tmux de um servidor.
Também uso o zsh como shell padrão, começo a numeração de janelas e painéis em 1 e mantenho um histórico maior de comandos. O atalho Ctrl+q desanexa a sessão, Ctrl+a r recarrega o arquivo de configuração e Ctrl+a - ou Ctrl+a \ cria divisões sem depender dos atalhos padrão.
Uma configuração inicial
Este é o núcleo da configuração que uso no meu ~/.tmux.conf:
# Use o zsh dentro das janelas do tmux.
set -g default-shell /usr/bin/zsh
set -g default-command /usr/bin/zsh
# Troque o prefixo padrão Ctrl+b por Ctrl+a.
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# Torne a resposta dos atalhos mais imediata.
set -s escape-time 1
set -g history-limit 100000
# Atalhos pessoais.
bind r source-file ~/.tmux.conf \; display-message "tmux recarregado"
bind C-q detach -P
bind '\\' split-window -h
bind - split-window -v
# Barra de status no topo, com host e horário.
set -g status-position top
set -g status-left " >> "
set -g status-right "@#H %d/%m/%Y %R "Depois de alterar o arquivo, não é necessário encerrar a sessão. O comando Ctrl+a r recarrega a configuração. Algumas opções só afetam novas janelas, por isso pode ser necessário criá-las novamente para perceber a mudança.
O que o tmux não faz
O tmux preserva a sessão, mas não substitui um sistema de backup, um gerenciador de processos ou uma ferramenta de monitoramento. Se o servidor for reiniciado, a sessão será encerrada. Da mesma forma, um processo que não foi iniciado dentro do tmux não será recuperado apenas porque o tmux está instalado.
Para serviços que precisam iniciar automaticamente, é melhor usar systemd ou outro supervisor apropriado. Para tarefas interativas, comandos longos e sessões SSH, o tmux costuma ser uma solução simples e suficiente.
Conclusão
O tmux resolve um problema bastante concreto: manter o trabalho do terminal organizado e disponível mesmo quando a janela ou a conexão não está mais aberta. Sessões separam projetos, janelas agrupam tarefas e painéis permitem acompanhar várias coisas ao mesmo tempo.
Depois que se acostuma com o prefixo e com alguns atalhos, fica difícil voltar a administrar servidores ou executar tarefas longas sem ele. No meu fluxo de trabalho, o tmux deixou de ser apenas uma ferramenta para dividir a tela e passou a ser uma camada de continuidade entre o terminal local e as máquinas remotas.