Terminal Multiplexers
tmux (principal) + GNU Screen (emergencial). Sessões persistem após desconexão SSH.
Por que usar multiplexer?
Sem multiplexer
❌ Fechar terminal → processos morrem
❌ Queda de conexão → trabalho perdido
❌ Um programa por vez visível
❌ Deploy longas travadas no terminal
❌ Queda de conexão → trabalho perdido
❌ Um programa por vez visível
❌ Deploy longas travadas no terminal
Com tmux/Screen
✅ Sessões persistem no servidor
✅ Reconectar exatamente onde parou
✅ Múltiplos panes numa janela
✅ Processos rodam sem monitorar
✅ Reconectar exatamente onde parou
✅ Múltiplos panes numa janela
✅ Processos rodam sem monitorar
tmux — Instalar
sudo apt install tmux -y
tmux -V
Hierarquia
Server (processo background)
└── Session "frontend" (contexto de trabalho)
├── Window 1: editor (aba)
│ ├── Pane A: nvim .
│ └── Pane B: terminal
└── Window 2: servidor
└── Pane A: npm run dev
Server é o daemon. Sessions são contextos (projetos). Windows são abas. Panes são divisões dentro de uma janela.
~/.tmux.conf
# prefix: Ctrl+a (em vez de Ctrl+b padrão)
unbind C-b
set -g prefix C-a
bind C-a send-prefix
# mouse — scroll e clique nos panes
set -g mouse on
# splits intuitivos (mesmo diretório)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# navegação entre panes estilo Vim
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# recarregar config
bind r source-file ~/.tmux.conf \; display "Reloaded!"
# histórico
set -g history-limit 10000
set -g base-index 1
setw -g pane-base-index 1
# status bar com 2 fusos: BR + DE
set -g status-right "#[fg=cyan]BR: #(TZ='America/Sao_Paulo' date '+%%H:%%M') #[fg=yellow]DE: #(TZ='Europe/Berlin' date '+%%H:%%M') #[fg=white]%d/%m/%Y"
set -g status-right-length 60
%% escapa o
% dentro de #(...) — necessário quando o comando shell contém formatação de data dentro do tmux.tmux source-file ~/.tmux.conf # recarregar sem reiniciar
Comandos de Sessão
| Comando | Ação |
|---|---|
| tmux | Nova sessão sem nome |
| tmux new -s nome | Nova sessão com nome |
| tmux ls | Listar sessões ativas |
| tmux attach -t nome | Entrar em sessão existente |
| tmux kill-session -t nome | Encerrar sessão |
| tmux kill-server | Encerrar todas as sessões |
| tmux rename-session -t atual novo | Renomear sessão |
Atalhos — Sessão (Prefix = Ctrl+a)
Prefix $
Renomear sessão atual
Prefix s
Listar e trocar de sessão
Prefix d
Detach — sessão continua rodando
Atalhos — Windows (abas)
Prefix c
Nova janela
Prefix ,
Renomear janela atual
Prefix n
Próxima janela
Prefix p
Janela anterior
Prefix 1–9
Ir para janela N
Prefix &
Fechar janela (confirmar)
Atalhos — Panes (divisões)
Prefix |
Dividir vertical (config acima)
Prefix -
Dividir horizontal
Prefix h/j/k/l
Navegar panes (Vim-style, config)
Prefix x
Fechar pane atual
Prefix z
Zoom no pane (toggle fullscreen)
Prefix { / }
Trocar pane de posição
Prefix q
Mostrar números dos panes
Prefix Espaço
Ciclar entre layouts padrão
Layouts padrão
| Teclas | Layout |
|---|---|
| Prefix M-1 | even-horizontal — panes lado a lado iguais |
| Prefix M-2 | even-vertical — panes em cima/baixo iguais |
| Prefix M-3 | main-horizontal — um grande embaixo |
| Prefix M-4 | main-vertical — um grande à esquerda |
| Prefix M-5 | tiled — grade igual |
Copy Mode (scroll + copiar)
# Ativar Vim keys no copy mode (~/.tmux.conf)
setw -g mode-keys vi
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-selection
| Tecla | Ação |
|---|---|
| Prefix [ | Entrar em copy mode |
| Ctrl+u / Ctrl+d | Subir / descer meia página |
| / | Buscar texto |
| v | Iniciar seleção (com vi keys) |
| y | Copiar seleção |
| q / Esc | Sair do copy mode |
Status Bar
Visualização da barra com dois fusos horários:
# ~/.tmux.conf
set -g status-left "[#S] "
set -g status-right "#[fg=cyan]BR: #(TZ='America/Sao_Paulo' date '+%%H:%%M') #[fg=yellow]DE: #(TZ='Europe/Berlin' date '+%%H:%%M') #[fg=white]%d/%m/%Y"
set -g status-right-length 60
set -g status-bg colour235
set -g status-fg white
setw -g window-status-current-style fg=yellow,bold
GNU Screen
Alternativa clássica. Pré-instalada em muitos servidores. Útil quando tmux não está disponível.
sudo apt install screen -y
screen --version
| Comando | Ação |
|---|---|
| screen | Nova sessão |
| screen -S nome | Nova sessão com nome |
| screen -ls | Listar sessões |
| screen -r nome | Reconectar |
| screen -Dr nome | Forçar reconexão (liberar de outro cliente) |
| screen -X -S nome quit | Encerrar sessão por fora |
~/.screenrc
# rolagem com PageUp/Down
termcapinfo xterm* ti@:te@
# buffer de scroll
defscrollback 10000
# barra de status
hardstatus alwayslastline "%{= kB}%-Lw%{= kY}%50>%n%f* %t%{= kB}%+Lw%<"
Atalhos Screen (Prefix = Ctrl+a)
Ctrl+a d
Detach
Ctrl+a c
Nova janela
Ctrl+a "
Listar janelas
Ctrl+a n/p
Próxima / anterior
Ctrl+a A
Renomear janela
Ctrl+a k
Fechar janela
Ctrl+a S
Dividir horizontal
Ctrl+a |
Dividir vertical (≥ 4.1)
Ctrl+a Tab
Trocar entre regiões
Ctrl+a [
Entrar em copy mode
tmux vs Screen
tmux recomendado
Desenvolvimento ativo, rico em recursos
✅ Desenvolvimento ativo
✅ Mouse habilitável
✅ Copy mode com Vim keys
✅ Config rica (tmux.conf)
✅ Multi-pane avançado
✅ Status bar personalizada
❌ Precisa instalar
screen emergencial
Pré-instalado, manutenção minimal
❌ Manutenção minimal
❌ Sem mouse
❌ Copy mode limitado
❌ Config limitada
✅ Split básico
❌ Status bar básica
✅ Pré-instalado em muitos servidores
Regra: use tmux para trabalho diário. Screen apenas quando tmux não estiver disponível no servidor.