Usando GNU Screen para Anexar e Desanexar Sessões de Console
GNU Screen é um multiplexador de terminal que permite criar, gerir e retomar de forma persistente múltiplas sessões de shell independentes a partir de uma única ligação de terminal. Quando desanexa uma sessão Screen, todos os processos em execução no seu interior continuam a ser executados em segundo plano — sobrevivendo a desligamentos SSH, quedas de rede e encerramentos de terminal — até que reanexa ou termina explicitamente a sessão.
Esta capacidade é indispensável para administradores de sistemas que gerem servidores remotos via SSH. Quer esteja a compilar um grande código-fonte, a executar uma migração de base de dados, a monitorizar registos ou a executar uma tarefa de backup de várias horas, o Screen garante que o trabalho continua independentemente do que aconteça à sua ligação de cliente.
Por que o GNU Screen Ainda é Relevante na Infraestrutura Moderna
Ferramentas como `tmux` ganharam popularidade, mas o GNU Screen continua a ser ubíquo em ambientes Linux empresariais, sistemas embebidos e infraestrutura legada. É fornecido como pacote padrão ou quase padrão na maioria das distribuições de servidor, não requer qualquer configuração para ser imediatamente útil, e o seu modelo de persistência de sessão é extremamente sólido. Num VPS ou servidor dedicado onde o tempo de atividade e a execução ininterrupta de tarefas são críticos, o Screen é frequentemente o caminho mais rápido para uma sessão persistente e fiável.
Principais vantagens operacionais:
- Persistência de sessão em caso de desligamento — os processos sobrevivem a tempos limite de SSH e interrupções de rede
- Multiplexação multi-janela — execute tarefas paralelas numa única ligação SSH
- Baixo consumo de recursos — impacto negligenciável em CPU e memória em comparação com alternativas baseadas em GUI
- Gestão de sessões com scripts — automatize a criação de sessões e a injeção de comandos via scripts de shell
- Ampla compatibilidade — disponível em praticamente todos os sistemas compatíveis com POSIX
GNU Screen vs. tmux: Escolher o Multiplexador Certo
Ambas as ferramentas resolvem o mesmo problema central, mas diferem significativamente em arquitetura, profundidade de configuração e ergonomia de scripting.
| Funcionalidade | GNU Screen | tmux |
|---|
| — | — | — |
|---|
| Disponibilidade padrão | Pré-instalado na maioria das distribuições | Requer instalação explícita |
|---|
| Ficheiro de configuração | `.screenrc` | `.tmux.conf` |
|---|
| Divisão de painéis | Vertical e horizontal (limitado) | Divisão completa de painéis com layouts |
|---|
| Scripting / automação | Injeção de comandos `screen -X` | `tmux send-keys`, API rica |
|---|
| Personalização da barra de estado | Básica | Altamente personalizável |
|---|
| Modo de cópia | Semelhante ao Vi, menos intuitivo | Modos Vi e Emacs, integração com área de transferência |
|---|
| Partilha de sessão | Suportado via flag `-x` | Suportado nativamente |
|---|
| Curva de aprendizagem | Suave | Moderada |
|---|
| Caso de uso ideal | Sessões persistentes rápidas, sistemas legados | Fluxos de trabalho complexos com múltiplos painéis |
|---|
Para persistência de sessão simples num servidor remoto — o caso de uso mais comum de um administrador de sistemas — a simplicidade do Screen é uma funcionalidade, não uma limitação.
Instalar o GNU Screen
Antes de prosseguir, verifique se o Screen já está presente:
“`bash
screen –version
“`
Se não estiver instalado, utilize o gestor de pacotes adequado para a sua distribuição.
Debian / Ubuntu:
“`bash
sudo apt-get update && sudo apt-get install screen
“`
CentOS / RHEL 7 e anteriores:
“`bash
sudo yum install screen
“`
CentOS Stream / RHEL 8+ / Fedora:
“`bash
sudo dnf install screen
“`
Arch Linux:
“`bash
sudo pacman -S screen
“`
macOS (via Homebrew):
“`bash
brew install screen
“`
Verificação:
“`bash
screen –version
Output example: Screen version 4.09.00 (GNU) 30-Jan-22
“`
Iniciar uma Sessão Screen
Início Básico de Sessão
“`bash
screen
“`
Isto coloca-o numa nova sessão Screen com uma linha de comandos de shell padrão. A sessão recebe automaticamente um identificador numérico baseado no PID.
Sessões com Nome (Fortemente Recomendado)
Atribua sempre um nome às suas sessões em ambientes de produção. As sessões com nome são muito mais fáceis de identificar e reanexar quando tem múltiplas tarefas em execução simultânea:
“`bash
screen -S session_name
“`
Exemplos práticos:
“`bash
screen -S db_migration
screen -S log_monitor
screen -S build_job
“`
A atribuição de nomes é especialmente valiosa quando se gerem múltiplas cargas de trabalho num servidor dedicado onde vários administradores podem estar a trabalhar simultaneamente.
Iniciar uma Sessão com um Comando
Pode iniciar o Screen e executar imediatamente um comando no seu interior:
“`bash
screen -S backup_job bash -c 'rsync -avz /data/ /backup/ && echo "Done"'
“`
A sessão persiste mesmo após a conclusão do comando, permitindo-lhe reanexar e inspecionar o resultado.
Desanexar de uma Sessão Screen
Desanexar é o fluxo de trabalho central que torna o Screen valioso. Suspende a sua vista da sessão enquanto deixa tudo no seu interior em execução.
Atalho de teclado:
“`
Ctrl + A, then D
“`
- `Ctrl + A` — o prefixo de comando do Screen (todos os comandos Screen começam com este)
- `D` — desanexar
Após desanexar, o seu terminal regressa à linha de comandos de shell original. A sessão Screen e todos os processos no seu interior continuam a ser executados em segundo plano. Verá uma mensagem de confirmação:
“`
[detached from 12345.db_migration]
“`
Erro crítico a evitar: Não confunda desanexar (`Ctrl+A, D`) com fechar uma janela (`Ctrl+A, K` elimina a janela atual). Fechar todas as janelas termina a sessão por completo.
Listar Sessões Screen Ativas
“`bash
screen -ls
“`
Exemplo de resultado:
“`
There are screens on:
18423.db_migration (Detached)
18891.log_monitor (Attached)
19204.build_job (Detached)
3 Sockets in /var/run/screen/S-root.
“`
Os indicadores de estado são significativos:
- Detached — nenhum terminal está atualmente ligado; a sessão está a ser executada em segundo plano
- Attached — um terminal está ativamente ligado a esta sessão
- Dead — o processo da sessão terminou, mas o ficheiro de socket não foi limpo (utilize `screen -wipe` para remover sessões mortas)
Reanexar a uma Sessão Screen
Reanexar pelo Nome da Sessão
“`bash
screen -r db_migration
“`
Reanexar pelo PID da Sessão
“`bash
screen -r 18423
“`
Reanexar Quando Existe Apenas Uma Sessão
“`bash
screen -r
“`
O Screen reanexará automaticamente se existir apenas uma sessão desanexada.
Forçar a Reanexação a uma Sessão Já Anexada
Este é o cenário que apanha muitos administradores desprevenidos. Se a sua ligação SSH caiu de forma abrupta, a sessão pode ainda aparecer como Attached porque o terminal anterior não desanexou corretamente. Tentar um `screen -r` padrão falhará com:
“`
There is a screen on: 18891.log_monitor (Attached)
There is no screen to be resumed.
“`
A solução é forçar a desanexação do terminal antigo e reanexar imediatamente:
“`bash
screen -d -r log_monitor
“`
- `-d` — desanexa remotamente a sessão do terminal que a detém atualmente
- `-r` — reanexar ao terminal atual
Alternativa com ID de sessão explícito:
“`bash
screen -d -r 18891
“`
Este é um dos comandos Screen mais importantes do ponto de vista operacional e é frequentemente necessário após desligamentos inesperados de um VPS.
Gestão de Múltiplas Janelas Dentro de uma Sessão
Uma das funcionalidades mais poderosas do Screen é a capacidade de executar múltiplas janelas independentes (terminais virtuais) dentro de uma única sessão. Cada janela mantém o seu próprio shell, árvore de processos e buffer de scroll.
Criar uma Nova Janela
“`
Ctrl + A, then C
“`
Navegar Entre Janelas
| Ação | Atalho |
|---|
| — | — |
|---|
| Próxima janela | `Ctrl + A, N` |
|---|
| Janela anterior | `Ctrl + A, P` |
|---|
| Ir para janela por número | `Ctrl + A, [0-9]` |
|---|
| Lista interativa de janelas | `Ctrl + A, "` |
|---|
| Última janela ativa | `Ctrl + A, Ctrl + A` |
|---|
Atribuir Nome a uma Janela
“`
Ctrl + A, then A
“`
Será solicitado que introduza um nome para a janela atual. As janelas com nome aparecem na lista de janelas e na barra de estado, tornando a navegação significativamente mais fácil quando se executam cinco ou mais tarefas paralelas.
Fechar uma Janela
Escreva `exit` no shell, ou prima `Ctrl + D`. Quando a última janela de uma sessão é fechada, a própria sessão Screen termina.
Para forçar o encerramento da janela atual sem sair do shell:
“`
Ctrl + A, then K
“`
Dividir o Ecrã (Regiões)
O GNU Screen suporta divisão básica do terminal, que é menos flexível do que o tmux, mas funcional para monitorização lado a lado.
Dividir horizontalmente (cima/baixo):
“`
Ctrl + A, then S
“`
Dividir verticalmente (esquerda/direita):
“`
Ctrl + A, then |
“`
Mover o foco para a próxima região:
“`
Ctrl + A, then Tab
“`
Remover a região atual (sem fechar a janela):
“`
Ctrl + A, then X
“`
Remover todas as regiões exceto a atual:
“`
Ctrl + A, then Q
“`
Após dividir, cada região está inicialmente vazia. Navegue para uma região com `Tab` e depois abra uma janela nela usando `Ctrl + A, N` ou `Ctrl + A, "`.
Partilhar uma Sessão Screen Entre Múltiplos Utilizadores
O Screen suporta partilha de sessão multi-utilizador, o que é útil para depuração colaborativa ou administração em par. Isto requer que o Screen esteja instalado com permissões setuid.
Ativar o modo multi-utilizador dentro de uma sessão:
“`
Ctrl + A, then :multiuser on
“`
Conceder acesso a outro utilizador:
“`
Ctrl + A, then :acladd username
“`
O outro utilizador pode então anexar à sua sessão:
“`bash
screen -x your_username/session_name
“`
Nota de segurança: As sessões Screen multi-utilizador requerem um controlo de acesso cuidadoso. Conceda permissões `acladd` apenas a contas de confiança. Em ambientes de alojamento partilhado, esta funcionalidade é tipicamente restrita.
Enviar Comandos para uma Sessão Desanexada
Uma das capacidades subestimadas do Screen é a possibilidade de injetar comandos numa sessão em execução sem reanexar:
“`bash
screen -S db_migration -X stuff "tail -f /var/log/app.logn"
“`
O comando `-X stuff` envia teclas para a sessão como se fossem digitadas. O `n` simula a pressão de Enter. Isto é extremamente útil para scripts de automação que precisam de interagir com uma sessão Screen em execução.
Configurar o Screen com .screenrc
O ficheiro `.screenrc` no seu diretório home controla o comportamento padrão do Screen. Uma configuração mínima mas prática:
“`bash
~/.screenrc
Disable the startup message
startup_message off
Set scrollback buffer to 10,000 lines
defscrollback 10000
Enable UTF-8
defutf8 on
Show a status bar at the bottom
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
Set default shell
shell -$SHELL
“`
A definição `defscrollback 10000` é particularmente importante — o buffer de scroll padrão é de apenas 100 linhas, o que é insuficiente para monitorizar processos de longa duração.
Referência Completa de Comandos Screen
| Comando / Atalho | Função |
|---|
| — | — |
|---|
| `screen` | Iniciar uma nova sessão sem nome |
|---|
| `screen -S name` | Iniciar uma sessão com nome |
|---|
| `screen -ls` | Listar todas as sessões |
|---|
| `screen -r name` | Reanexar a uma sessão desanexada |
|---|
| `screen -d -r name` | Forçar desanexação e reanexar |
|---|
| `screen -x name` | Anexar a uma sessão já anexada (vista partilhada) |
|---|
| `screen -wipe` | Remover sockets de sessões mortas |
|---|
| `Ctrl + A, D` | Desanexar da sessão atual |
|---|
| `Ctrl + A, C` | Criar uma nova janela |
|---|
| `Ctrl + A, N` | Próxima janela |
|---|
| `Ctrl + A, P` | Janela anterior |
|---|
| `Ctrl + A, "` | Lista interativa de janelas |
|---|
| `Ctrl + A, A` | Renomear a janela atual |
|---|
| `Ctrl + A, K` | Encerrar a janela atual |
|---|
| `Ctrl + A, S` | Dividir horizontalmente |
|---|
| `Ctrl + A, | ` | Dividir verticalmente |
|---|
| `Ctrl + A, Tab` | Mover para a próxima região |
|---|
| `Ctrl + A, Q` | Remover todas as regiões exceto a atual |
|---|
| `Ctrl + A, [` | Entrar no modo de cópia/scroll |
|---|
| `Ctrl + A, ?` | Mostrar todos os atalhos de teclado |
|---|
| `Ctrl + A, :quit` | Terminar a sessão inteira |
|---|
Registar o Resultado de uma Sessão Screen
O Screen pode registar tudo o que é impresso numa janela num ficheiro — inestimável para auditar tarefas de longa duração:
Ativar/desativar o registo para a janela atual:
“`
Ctrl + A, then H
“`
Isto cria um ficheiro com o nome `screenlog.N` (onde N é o número da janela) no diretório atual. Também pode ativar o registo a partir da linha de comandos ao iniciar uma sessão:
“`bash
screen -L -S monitored_job
“`
Ou especificar um ficheiro de registo personalizado em `.screenrc`:
“`bash
logfile /var/log/screen/session_%t_%Y%m%d.log
“`
Casos de Uso Práticos em Servidores Remotos
Migrações de base de dados de longa duração: Inicie uma migração dentro de uma sessão Screen com nome, desanexe e monitorize o progresso reanexando periodicamente. Se a ligação SSH cair, a migração continua sem interrupção.
Monitorização contínua de registos: Execute `tail -f` ou `multitail` numa janela Screen. Desanexe e reanexe sempre que precisar de verificar o estado atual.
Tarefas de compilação: Compilações grandes de C++ ou do kernel podem demorar horas. O Screen garante que a compilação é concluída mesmo que o seu portátil perca conectividade.
Processos interativos que não podem ser executados em segundo plano: Algumas ferramentas — CLIs de base de dados, sessões interativas de Python, instaladores baseados em texto — não podem simplesmente ser enviadas para segundo plano com `&`. O Screen envolve-as numa sessão persistente de forma limpa.
Coordenação entre múltiplos administradores: Usando `screen -x`, dois administradores podem observar a mesma sessão simultaneamente, o que é útil durante a resposta a incidentes num servidor dedicado.
Se estiver a gerir infraestrutura web juntamente com sessões persistentes, combinar o Screen com um VPS com cPanel bem configurado oferece-lhe tanto uma interface de gestão gráfica como capacidade completa de multiplexação de terminal. Para equipas que gerem renovações de SSL e implementações de certificados via linha de comandos, os Certificados SSL combinados com scripts de automação baseados em Screen podem tornar o processo totalmente autónomo.
Erros Comuns e Como Evitá-los
Acumulação de sessões órfãs: Os administradores frequentemente esquecem-se de terminar sessões após a conclusão das tarefas. Execute `screen -ls` regularmente e utilize `screen -wipe` para limpar sockets mortos. Termine sessões inativas com `screen -S session_name -X quit`.
Buffer de scroll demasiado pequeno: O buffer padrão de 100 linhas significa que perde rapidamente o histórico de resultados. Defina sempre `defscrollback 10000` ou superior em `.screenrc`.
Sessões Screen aninhadas: Se fizer SSH a partir de dentro de uma sessão Screen e iniciar outra sessão Screen no host remoto, os comandos `Ctrl + A` serão capturados pela sessão exterior. Utilize `Ctrl + A, A` para enviar um `Ctrl + A` literal para a sessão interior, ou utilize `Ctrl + A, :sessionname` para diferenciar.
Sessão que permanece como Attached após desligamento: Uma ligação SSH interrompida pode deixar uma sessão no estado Attached. Utilize sempre `screen -d -r` em vez do simples `screen -r` ao reconectar após um desligamento inesperado.
Problemas de locale e codificação: Se vir caracteres distorcidos, certifique-se de que o seu terminal e o Screen utilizam ambos UTF-8. Adicione `defutf8 on` ao `.screenrc` e verifique se a variável de ambiente `LANG` está definida para um locale UTF-8 (por exemplo, `en_US.UTF-8`).
Matriz de Decisão: Quando Usar o Screen
| Cenário | Usar Screen? | Notas |
|---|
| — | — | — |
|---|
| Processo remoto de longa duração | Sim | Caso de uso principal |
|---|
| Comando SSH rápido e pontual | Não | Sobrecarga não justificada |
|---|
| Fluxo de trabalho de terminal com múltiplos painéis | Talvez | Considere o tmux para layouts complexos |
|---|
| Sessão de depuração partilhada | Sim | Utilize `-x` para vista partilhada |
|---|
| Script automatizado sem interação | Não | Utilize `nohup` ou serviço `systemd` |
|---|
| Processo interativo que não pode ser daemonizado | Sim | O Screen é ideal |
|---|
| Painel de monitorização persistente | Sim | Combine com janelas com nome e registo |
|---|
Lista de Verificação de Pontos-Chave Técnicos
- Atribua sempre nomes às sessões com `screen -S descriptive_name` — as sessões sem nome tornam-se ingeríveis em escala
- Defina `defscrollback 10000` em `.screenrc` antes de precisar, não depois de perder o resultado
- Utilize `screen -d -r` como comando de reanexação padrão para lidar com os estados Attached e Detached sem ter de pensar nisso
- Ative o registo de sessão com `screen -L` para qualquer tarefa cujo resultado possa precisar de auditar posteriormente
- Execute `screen -wipe` periodicamente para remover sockets de sessões mortas e manter o resultado de `screen -ls` legível
- Injete comandos em sessões desanexadas com `screen -X stuff` para automatizar a interação sem reanexar
- Em ambientes com múltiplos administradores, configure `.screenrc` com `multiuser on` e ACLs explícitas em vez de depender de acesso root partilhado
- Teste a sua configuração `.screenrc` num sistema que não seja de produção antes de a implementar em infraestrutura crítica
Perguntas Frequentes
O que acontece a uma sessão Screen se o servidor reiniciar?
Todas as sessões Screen são perdidas ao reiniciar. As sessões Screen são processos em execução na memória — não sobrevivem a um reinício do sistema. Para serviços verdadeiramente persistentes, utilize ficheiros de unidade `systemd` ou scripts de init. O Screen destina-se à persistência de sessões interativas em caso de desligamento, não em caso de reinício.
Posso usar o Screen numa conta de alojamento partilhado?
Os ambientes de alojamento web partilhado padrão tipicamente restringem o acesso SSH e podem não ter o Screen instalado ou acessível. O Screen é mais eficaz em ambientes VPS ou de servidor dedicado onde tem acesso completo ao shell e privilégios de root ou sudo.
Qual é a diferença entre `screen -r` e `screen -x`?
`screen -r` reanexar a uma sessão desanexada, dando-lhe acesso exclusivo. `screen -x` anexa a uma sessão que está já anexada, criando uma vista partilhada onde múltiplos terminais veem a mesma sessão simultaneamente — útil para resolução colaborativa de problemas.
Como faço scroll para cima numa sessão Screen para ver o resultado anterior?
Entre no modo de cópia/scroll com `Ctrl + A, [`. Utilize as teclas de seta ou Page Up/Page Down para navegar. Prima `Escape` ou `Q` para sair do modo de cópia. Certifique-se de que o seu buffer de scroll é suficientemente grande definindo `defscrollback` em `.screenrc`.
O GNU Screen ainda é mantido ativamente?
Sim. O GNU Screen é mantido ativamente sob o Projeto GNU. A versão 4.9.x foi lançada em 2022. Embora não receba o desenvolvimento rápido de funcionalidades que o tmux recebe, recebe correções de segurança e correções de erros, tornando-o fiável para uso em produção em infraestrutura de servidor de longa duração.
