Conteúdos

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 servidor

Se 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 projeto

O 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.