O Guia Completo de Comandos GNU Screen no Linux
GNU Screen é um multiplexador de terminal que permite criar, gerir e manter múltiplas sessões de shell a partir de uma única janela de terminal. Quando se desliga de uma sessão Screen, todos os processos em execução dentro dela continuam a executar — sobrevivendo a desconexões SSH, quedas de rede e encerramentos de terminal — e permanecem totalmente acessíveis no momento em que se volta a ligar.
Para qualquer pessoa que gira servidores remotos via SSH, esta capacidade elimina uma classe inteira de risco operacional: uma ligação interrompida já não mata uma migração de base de dados em execução, um trabalho de compilação de várias horas, ou um processo de monitorização de logs em tempo real.
Por Que o GNU Screen Continua Relevante na Administração Moderna de Linux
Ferramentas como o tmux ganharam popularidade, mas o Screen é fornecido como pacote padrão ou quase padrão em praticamente todas as distribuições Linux empresariais e imagens de servidor mínimas. Quando acede via SSH a uma máquina bare-metal ou a uma instância de VPS Hosting recentemente provisionada, o Screen está quase sempre disponível sem qualquer instalação adicional. O seu baixo consumo de memória e a conformidade com POSIX tornam-no a escolha pragmática em ambientes com restrições ou bloqueados.
Capacidades principais em resumo:
- Persistência de sessão: Os processos sobrevivem à desconexão do terminal, ao timeout de SSH e a falhas do lado do cliente
- Multiplexação de janelas: Múltiplas janelas de shell independentes dentro de uma única sessão
- Partilha de sessão: Dois utilizadores podem ligar-se à mesma sessão simultaneamente para depuração colaborativa
- Acesso à consola série: O Screen pode ligar-se diretamente a dispositivos `/dev/ttyS*` para gestão de servidores fora de banda
- Inicialização programável: O ficheiro de configuração `.screenrc` permite ambientes multi-janela totalmente automatizados no arranque
GNU Screen vs. tmux: Escolher o Multiplexador Certo
Ambas as ferramentas resolvem o mesmo problema central, mas com filosofias de design diferentes. A tabela abaixo cobre as distinções que importam em ambientes de produção.
| Funcionalidade | GNU Screen | tmux |
|---|
| — | — | — |
|---|
| Disponibilidade padrão | Pré-instalado na maioria das distros | Requer instalação explícita |
|---|
| Ficheiro de configuração | `~/.screenrc` | `~/.tmux.conf` |
|---|
| Divisão de painéis (horizontal/vertical) | Limitada (apenas vertical via regiões) | Divisão de painéis completa e flexível |
|---|
| Partilha de sessão | Multi-attach nativo | Multi-attach nativo |
|---|
| Scripting / automação | Injeção de comandos `screen -X` | `tmux send-keys`, API rica |
|---|
| Consumo de memória | Muito baixo | Baixo |
|---|
| Suporte a dispositivos série | Sim (`screen /dev/ttyS0`) | Não |
|---|
| Personalização da barra de estado | Moderada (hardstatus) | Altamente flexível |
|---|
| Modo de cópia | Estilo vi | Estilo vi ou emacs |
|---|
| Ecossistema de plugins | Nenhum | Ativo (TPM) |
|---|
| Caso de uso ideal | Servidores mínimos, consolas série, ambientes legados | Estações de trabalho de desenvolvimento, layouts complexos |
|---|
Orientação prática: Num Servidor Dedicado sem interface gráfica a executar tarefas de longa duração em segundo plano, a simplicidade e disponibilidade universal do Screen tornam-no a escolha com menor fricção. Para um programador que necessita de painéis divididos e uma barra de estado rica, o tmux é a melhor opção.
Instalar o GNU Screen
O Screen está pré-instalado na maioria das distribuições. Verifique com:
“`bash
screen –version
“`
Se estiver ausente, instale-o utilizando o gestor de pacotes adequado:
Debian / Ubuntu:
“`bash
sudo apt-get update && sudo apt-get install screen
“`
CentOS / RHEL 7:
“`bash
sudo yum install screen
“`
CentOS Stream / RHEL 8+ / AlmaLinux / Rocky Linux:
“`bash
sudo dnf install screen
“`
Fedora:
“`bash
sudo dnf install screen
“`
Arch Linux:
“`bash
sudo pacman -S screen
“`
Alpine Linux (comum em contentores):
“`bash
apk add screen
“`
Após a instalação, não é necessário nenhum daemon ou serviço. O Screen opera inteiramente como um processo de espaço de utilizador.
Iniciar uma Sessão Screen
Sessão Básica
“`bash
screen
“`
Isto coloca-o numa nova sessão com uma shell padrão. A interface é indistinguível de um terminal normal até utilizar o prefixo de comando do Screen.
Sessão com Nome (Recomendado)
“`bash
screen -S session_name
“`
Nomeie sempre as suas sessões em produção. As sessões sem nome são identificadas apenas pelo seu PID, o que torna a reconexão propensa a erros quando múltiplas sessões estão em execução.
Dica de convenção de nomenclatura: Utilize nomes descritivos que reflitam a carga de trabalho — `screen -S db-migration`, `screen -S log-monitor`, `screen -S build-php82`. Isto traz benefícios quando regressa a um servidor após horas de ausência.
Iniciar uma Sessão e Executar um Comando Imediatamente
“`bash
screen -S backup-job bash -c 'rsync -avz /data/ user@remote:/backup/ && echo DONE'
“`
A sessão persiste mesmo após a conclusão do comando, permitindo-lhe inspecionar o resultado mais tarde.
Iniciar uma Sessão em Modo Desligado
“`bash
screen -dmS headless-job ./long_running_script.sh
“`
As flags `-dm` criam a sessão e desligam-se imediatamente. Este é o padrão correto para lançar tarefas em segundo plano a partir de cron ou scripts de implementação — o processo é executado dentro de uma sessão Screen com nome e recuperável, sem necessitar de um terminal interativo.
O Prefixo de Comando: Compreender Ctrl+A
Todos os atalhos de teclado do Screen começam com a sequência de escape `Ctrl+A`. Esta combinação de teclas indica ao Screen que o próximo caractere é um comando, não uma entrada para o programa em execução. Compreender este modelo é essencial antes de memorizar atalhos individuais.
Se executar um programa dentro do Screen que por si mesmo utiliza `Ctrl+A` (por exemplo, alguns editores de texto ou a biblioteca `readline`), pode enviar um `Ctrl+A` literal para o programa interno premindo `Ctrl+A` duas vezes (`Ctrl+A, Ctrl+A`).
Desligar e Religar Sessões
Desligar de uma Sessão em Execução
“`
Ctrl+A, D
“`
A sessão continua a ser executada em segundo plano. É devolvido à shell principal. Nenhum processo dentro da sessão é interrompido.
Listar Todas as Sessões
“`bash
screen -ls
“`
Exemplo de saída:
“`
There are screens on:
14231.db-migration (Detached)
14089.log-monitor (Attached)
13901.build-php82 (Detached)
3 Sockets in /var/run/screen/S-deploy.
“`
O estado `Attached` significa que outro terminal está atualmente ligado a essa sessão. `Detached` significa que está em execução mas nenhum terminal está ligado.
Religar a uma Sessão Específica
“`bash
screen -r db-migration
“`
Ou por PID:
“`bash
screen -r 14231
“`
Forçar a Ligação a uma Sessão Já Ligada
Se uma sessão mostrar `Attached` mas precisar de a assumir (por exemplo, após uma ligação SSH obsoleta a ter deixado bloqueada):
“`bash
screen -d -r log-monitor
“`
A flag `-d` desliga forçosamente a outra ligação antes de o religar. Esta é uma técnica de recuperação crítica quando uma sessão SSH anterior terminou sem se desligar corretamente.
Multi-Attach: Dois Utilizadores na Mesma Sessão
“`bash
screen -x session_name
“`
Ambos os terminais veem resultados idênticos em tempo real. Isto é inestimável para depuração em par ou demonstrações guiadas de servidor com um colega — ambas as partes observam e podem interagir com a mesma shell.
Gerir Janelas Dentro de uma Sessão
Uma única sessão Screen pode conter um número ilimitado de janelas. Cada janela é uma shell (ou processo) independente.
Criar uma Nova Janela
“`
Ctrl+A, C
“`
Navegar Entre Janelas
| Atalho | Ação |
|---|
| — | — |
|---|
| `Ctrl+A, N` | Próxima janela |
|---|
| `Ctrl+A, P` | Janela anterior |
|---|
| `Ctrl+A, 0–9` | Ir diretamente para a janela pelo número |
|---|
| `Ctrl+A, "` | Lista interativa de todas as janelas |
|---|
| `Ctrl+A, '` | Prompt para introduzir número ou nome da janela |
|---|
Renomear uma Janela
“`
Ctrl+A, A
“`
Escreva o novo nome e prima Enter. Os nomes de janelas significativos são exibidos na barra hardstatus, tornando a navegação muito mais rápida em sessões com muitas janelas.
Fechar uma Janela
Escreva `exit` ou prima `Ctrl+D` na shell da janela. Quando a última janela de uma sessão é fechada, a sessão termina.
Dividir o Ecrã em Regiões
O Screen suporta a divisão do terminal em múltiplas regiões visíveis, cada uma exibindo uma janela diferente simultaneamente.
Dividir Horizontalmente (cima/baixo)
“`
Ctrl+A, S
“`
Dividir Verticalmente (esquerda/direita)
“`
Ctrl+A, |
“`
Nota: A divisão vertical requer Screen 4.1.0 ou posterior.
Mover Entre Regiões
“`
Ctrl+A, Tab
“`
Atribuir uma Janela a uma Região
Após mover o foco para uma região, utilize `Ctrl+A, "` para selecionar qual janela exibir aí.
Remover uma Região
“`
Ctrl+A, X (remove current region)
Ctrl+A, Q (remove all regions except current)
“`
Distinção importante: Remover uma região não fecha a janela que está a ser executada dentro dela. A janela continua a ser executada; simplesmente deixa de ser exibida nessa divisão.
Copiar e Colar (Modo de Retrocesso)
O Screen mantém um buffer de retrocesso para cada janela. Para aceder a ele:
“`
Ctrl+A, [
“`
Isto entra no modo de cópia. A navegação utiliza teclas no estilo vi:
- `h`, `j`, `k`, `l` — mover cursor
- `Ctrl+F` / `Ctrl+B` — avançar / recuar página
- `/` — pesquisar para a frente
- `?` — pesquisar para trás
- `Space` — marcar início da seleção
- `Space` (novamente) — marcar fim e copiar para o buffer
Para colar o texto copiado:
“`
Ctrl+A, ]
“`
O buffer de retrocesso padrão é de 100 linhas. Para monitorização de logs de servidor, aumente este valor significativamente em `.screenrc` (abordado abaixo).
Bloquear uma Sessão Screen
“`
Ctrl+A, X
“`
A sessão bloqueia imediatamente e solicita a sua senha de utilizador Unix antes de permitir o acesso. Utilize isto quando se afasta de um terminal que está ligado a um servidor sensível — é mais rápido do que fechar a ligação SSH e religar.
Enviar Comandos para uma Sessão Sem Se Ligar
A flag `-X` permite-lhe injetar comandos Screen numa sessão em execução a partir do exterior:
“`bash
screen -S db-migration -X stuff "tail -f /var/log/mysql/error.logn"
“`
O comando `stuff` envia teclas para a janela ativa da sessão com nome. O `n` simula premir Enter. Esta técnica é utilizada em scripts de automação de implementação para interagir com sessões Screen de longa duração sem necessitar de ligação humana.
Configurar o Screen com .screenrc
O ficheiro `~/.screenrc` é lido no arranque e controla o comportamento padrão do Screen. Um `.screenrc` bem elaborado transforma o Screen de um multiplexador básico num ambiente genuinamente ergonómico.
Crie ou edite-o:
“`bash
nano ~/.screenrc
“`
Configuração Recomendada de .screenrc para Produção
“`bash
Disable the startup message
startup_message off
Set scrollback buffer to 10,000 lines (critical for log monitoring)
defscrollback 10000
Enable UTF-8
defutf8 on
Set default shell
shell -$SHELL
Visual bell instead of audible
vbell on
Hardstatus bar: shows hostname, window list, and current time
hardstatus on
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
Bind F2 to create a new window
bindkey -k k2 screen
Change escape key to Ctrl+B (useful if Ctrl+A conflicts with other tools)
escape ^Bb
Auto-detach on hangup signal (critical for SSH session drops)
autodetach on
Disable flow control (prevents Ctrl+S from freezing the terminal)
defflow off
“`
A diretiva `autodetach on` é inegociável para uso com SSH. Sem ela, se a sua ligação SSH cair inesperadamente (em vez de premir `Ctrl+A, D`), o Screen pode terminar a sessão em vez de a desligar. Com `autodetach on`, um sinal SIGHUP (enviado quando o SSH se desliga) desencadeia um desligamento limpo em vez do término da sessão.
`defflow off` previne a frustração comum de premir acidentalmente `Ctrl+S` e aparentemente congelar o terminal. Muitos administradores perdem minutos a diagnosticar um terminal “congelado” que está simplesmente em pausa de controlo de fluxo XON/XOFF.
Casos de Uso Práticos em Produção
Executar uma Migração de Base de Dados em Segurança
“`bash
screen -S db-migrate
Inside the session:
php artisan migrate –force 2>&1 | tee /var/log/migration-$(date +%F).log
Detach: Ctrl+A, D
Reattach later to check progress:
screen -r db-migrate
“`
Se a ligação SSH cair a meio da migração, o processo continua. Volta a ligar-se e encontra-o ainda em execução ou concluído com toda a saída preservada no log e no buffer de retrocesso.
Monitorizar Múltiplos Ficheiros de Log Simultaneamente
“`bash
screen -S monitoring
Window 0: nginx access log
tail -f /var/log/nginx/access.log
Ctrl+A, C — new window
Window 1: application error log
tail -f /var/log/app/error.log
Ctrl+A, C — new window
Window 2: system messages
journalctl -f
“`
Navegue entre janelas com `Ctrl+A, "` para ver qual log está a gerar atividade.
Script de Implementação Automatizado com Screen
“`bash
#!/bin/bash
screen -dmS deploy bash -c '
git pull origin main &&
composer install –no-dev &&
php artisan config:cache &&
systemctl reload php8.2-fpm &&
echo "Deployment complete at $(date)" >> /var/log/deploy.log
'
echo "Deployment started in background screen session 'deploy'"
echo "Monitor with: screen -r deploy"
“`
Este padrão é especialmente útil num VPS com cPanel onde pode estar a gerir múltiplas implementações de aplicações a partir de uma única shell administrativa.
Acesso à Consola Série
“`bash
screen /dev/ttyS0 115200
“`
O Screen funciona também como emulador de terminal série. Esta é a técnica padrão para aceder à consola de um servidor físico, switch de rede ou dispositivo embebido através de uma ligação série — sem necessitar de minicom ou picocom.
Armadilhas Comuns e Como Evitá-las
Sessões Screen aninhadas: Se aceder via SSH a partir de uma sessão Screen na Máquina A para a Máquina B e iniciar o Screen aí, tem agora duas camadas de tratamento de `Ctrl+A`. A sessão Screen interna captura `Ctrl+A` antes que a externa o veja. Para enviar `Ctrl+A` para a sessão externa, prima `Ctrl+A, Ctrl+A`. Para evitar confusão, altere a tecla de escape da sessão interna no seu `.screenrc` utilizando `escape ^Bb`.
Sessões mortas que não limpam: Se o Screen falhar ou o anfitrião reiniciar de forma não limpa, os ficheiros de socket podem persistir em `/var/run/screen/` ou `~/.screen/`, mostrando sessões como `Dead`. Limpe-os com:
“`bash
screen -wipe
“`
Sessão pertencente a root vs. utilizador: Uma sessão Screen iniciada como root não pode ser religada por um utilizador não-root, e vice-versa. Se executar `sudo su` dentro de uma sessão Screen e depois se desligar, volte a ligar como root ou via `sudo screen -r`.
Incompatibilidade da variável `TERM`: Algumas aplicações dentro do Screen comportam-se incorretamente porque `TERM` está definido como `screen` ou `screen-256color` em vez de `xterm-256color`. Se uma aplicação TUI renderizar incorretamente, verifique com `echo $TERM` e substitua em `.screenrc` com `term xterm-256color` se necessário.
Esgotamento do buffer de retrocesso: O retrocesso padrão de 100 linhas é inadequado para qualquer monitorização séria de logs. Defina sempre `defscrollback 10000` ou superior em `.screenrc` em servidores utilizados para administração ativa.
Referência Rápida: Comandos Essenciais do Screen
| Ação | Comando / Atalho |
|---|
| — | — |
|---|
| Iniciar nova sessão | `screen` |
|---|
| Iniciar sessão com nome | `screen -S name` |
|---|
| Iniciar sessão desligada | `screen -dmS name` |
|---|
| Listar sessões | `screen -ls` |
|---|
| Religar por nome | `screen -r name` |
|---|
| Forçar religação | `screen -d -r name` |
|---|
| Multi-attach | `screen -x name` |
|---|
| Desligar | `Ctrl+A, D` |
|---|
| Nova janela | `Ctrl+A, C` |
|---|
| Próxima janela | `Ctrl+A, N` |
|---|
| Janela anterior | `Ctrl+A, P` |
|---|
| Lista de janelas | `Ctrl+A, "` |
|---|
| Renomear janela | `Ctrl+A, A` |
|---|
| Dividir horizontalmente | `Ctrl+A, S` |
|---|
| Dividir verticalmente | `Ctrl+A, | ` |
|---|
| Mover entre regiões | `Ctrl+A, Tab` |
|---|
| Entrar no modo de cópia/retrocesso | `Ctrl+A, [` |
|---|
| Colar buffer | `Ctrl+A, ]` |
|---|
| Bloquear sessão | `Ctrl+A, X` |
|---|
| Encerrar janela atual | `Ctrl+A, K` |
|---|
| Encerrar sessão inteira | `Ctrl+A, ` |
|---|
| Enviar comando para sessão | `screen -S name -X stuff "cmdn"` |
|---|
| Limpar sessões mortas | `screen -wipe` |
|---|
Contexto de Implementação: Screen em Ambientes de Alojamento Gerido
O Screen opera ao nível da shell, tornando-o compatível com qualquer ambiente Linux onde tenha acesso SSH. Isto inclui servidores bare-metal, Servidores Dedicados e instâncias padrão de VPS Hosting. Não está disponível em ambientes de alojamento partilhado onde o acesso SSH é restrito ou inexistente.
Para cargas de trabalho que envolvem processamento persistente em segundo plano — como inferência de modelos acelerada por GPU, pré-processamento de grandes conjuntos de dados ou tarefas em lote de longa duração — combinar o Screen com um ambiente de GPU Hosting proporciona tanto os recursos computacionais como a persistência de sessão necessários para gerir tarefas de várias horas de forma fiável.
Se a sua infraestrutura inclui serviços web juntamente com processamento em segundo plano, combinar tarefas de backend geridas pelo Screen com Certificados SSL devidamente protegidos nos seus endpoints públicos garante que toda a pilha — tanto a camada de aplicação visível como o backend administrativo — opera com os controlos de segurança adequados.
Matriz de Decisão: Quando Usar o Screen
Utilize o Screen quando:
- Necessita de persistência de sessão num servidor onde apenas o Screen está disponível
- Está a aceder a uma consola série ou dispositivo embebido
- Está a executar um único processo de longa duração e não necessita de painéis divididos
- Está num sistema mínimo baseado em Alpine ou BusyBox
- Precisa de partilhar uma sessão com outro administrador em tempo real
Considere o tmux em vez disso quando:
- Necessita de divisão flexível de painéis horizontal e vertical
- Pretende um ecossistema de plugins para melhorias na barra de estado
- Está a construir um ambiente de estação de trabalho de desenvolvimento com layouts complexos
- A sua equipa padronizou na gestão de configuração do tmux
Não utilize nenhum (utilize systemd ou supervisor em vez disso) quando:
- O objetivo é puramente executar um serviço em segundo plano que deve sobreviver a reinicializações
- Não necessita de acesso interativo ao processo em execução
- O processo deve reiniciar automaticamente em caso de falha
Lista de Verificação de Pontos-Chave Técnicos
Antes de confiar no Screen num ambiente de produção, verifique o seguinte:
- `autodetach on` está presente em `~/.screenrc` — sem isto, quedas de SSH podem encerrar sessões
- `defscrollback` está definido para pelo menos 5000 linhas para cargas de trabalho com muitos logs
- `defflow off` está definido para prevenir congelamentos acidentais de `Ctrl+S`
- Todas as sessões de longa duração têm nome (`-S flag`) — nunca confie apenas na identificação por PID
- Conhece o comando de recuperação `screen -d -r` para sessões ligadas obsoletas
- Os sockets de sessões mortas são periodicamente limpos com `screen -wipe`
- Se executar como múltiplos utilizadores, compreende o limite de propriedade de sessão root/utilizador
- A variável `TERM` é verificada se as aplicações TUI renderizarem incorretamente dentro do Screen
- Para tarefas em segundo plano totalmente automatizadas, é utilizado `screen -dmS` em vez de `nohup` ou `&` simples, proporcionando uma sessão recuperável e inspecionável
FAQ
O GNU Screen sobrevive a uma reinicialização do servidor?
Não. As sessões Screen são mantidas em memória como processos. Uma reinicialização completa do servidor termina todas as sessões Screen e os seus processos filhos. Para processos que devem sobreviver a reinicializações, utilize unidades systemd ou um supervisor de processos como o Supervisor. O Screen é a ferramenta correta para persistência interativa entre desconexões, não entre reinicializações.
Qual é a diferença entre `screen -r` e `screen -x`?
`screen -r` volta a ligar a uma sessão desligada — falha se a sessão já estiver ligada noutro local. `screen -x` liga a uma sessão independentemente do seu estado de ligação atual, permitindo que dois terminais partilhem a mesma sessão simultaneamente. Utilize `-x` para depuração colaborativa; utilize `-r` para religação padrão.
Como faço scroll para cima dentro de uma janela Screen?
Entre no modo de cópia com `Ctrl+A, [`, depois utilize as teclas de seta, `Page Up`/`Page Down`, ou navegação no estilo vi (`Ctrl+F`, `Ctrl+B`). Prima `Escape` ou `q` para sair do modo de cópia. Certifique-se de que `defscrollback` em `.screenrc` está definido suficientemente alto para reter o histórico de que necessita.
O Screen pode ser utilizado sem privilégios de root?
Sim. O Screen é executado inteiramente como o utilizador que o invoca. Não são necessários privilégios de root para criar, ligar ou gerir sessões. Os ficheiros de socket são armazenados num diretório por utilizador (tipicamente `/var/run/screen/S-username/`). A única exceção é se o Screen em si não estiver instalado — a instalação requer acesso ao gestor de pacotes, que tipicamente requer root ou sudo.
Por que a minha sessão Screen mostra “Attached” quando ninguém está ligado?
Isto acontece tipicamente quando uma ligação SSH caiu sem enviar um SIGHUP limpo — por exemplo, devido a um timeout de rede em vez de um logout explícito. A sessão mantém o seu estado `Attached` porque o Screen nunca recebeu o sinal de desconexão. Utilize `screen -d -r session_name` para desligar forçosamente a ligação fantasma e religar de forma limpa.
