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
09.10.2024

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.

FuncionalidadeGNU Screentmux
Disponibilidade padrãoPré-instalado na maioria das distribuiçõesRequer instalação explícita
Ficheiro de configuração`.screenrc``.tmux.conf`
Divisão de painéisVertical e horizontal (limitado)Divisão completa de painéis com layouts
Scripting / automaçãoInjeção de comandos `screen -X``tmux send-keys`, API rica
Personalização da barra de estadoBásicaAltamente personalizável
Modo de cópiaSemelhante ao Vi, menos intuitivoModos Vi e Emacs, integração com área de transferência
Partilha de sessãoSuportado via flag `-x`Suportado nativamente
Curva de aprendizagemSuaveModerada
Caso de uso idealSessões persistentes rápidas, sistemas legadosFluxos 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

“`

AçãoAtalho
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 / AtalhoFunçã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árioUsar Screen?Notas
Processo remoto de longa duraçãoSimCaso de uso principal
Comando SSH rápido e pontualNãoSobrecarga não justificada
Fluxo de trabalho de terminal com múltiplos painéisTalvezConsidere o tmux para layouts complexos
Sessão de depuração partilhadaSimUtilize `-x` para vista partilhada
Script automatizado sem interaçãoNãoUtilize `nohup` ou serviço `systemd`
Processo interativo que não pode ser daemonizadoSimO Screen é ideal
Painel de monitorização persistenteSimCombine 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.

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