15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
08.10.2024

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.

FuncionalidadeGNU Screentmux
Disponibilidade padrãoPré-instalado na maioria das distrosRequer 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ãoMulti-attach nativoMulti-attach nativo
Scripting / automaçãoInjeção de comandos `screen -X``tmux send-keys`, API rica
Consumo de memóriaMuito baixoBaixo
Suporte a dispositivos sérieSim (`screen /dev/ttyS0`)Não
Personalização da barra de estadoModerada (hardstatus)Altamente flexível
Modo de cópiaEstilo viEstilo vi ou emacs
Ecossistema de pluginsNenhumAtivo (TPM)
Caso de uso idealServidores mínimos, consolas série, ambientes legadosEstaçõ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

“`

AtalhoAçã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çãoComando / 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.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar