Screen - O Gerenciador de Sessões em modo texto

Introdução
Imagine as seguintes situações:
  1. Você está digitando um texto no vi (ou outro editor de texto) conectado através de uma sessão SSH e por alguma razão a conexão cai. Quando você reconecta, vê que o vi ainda está rodando, mas não tem como recuperar a sessão onde ele se encontra. Assim, você mata o processo e começa novamente.
  2. Você coloca um arquivo para fazer download através do wget; mas o download acaba durando mais tempo do que o desejado. Suas opções são: cancelar o download e continuar depois (o que desperdiçaria tudo o que já foi baixado) ou deixar a sessão aberta sem você por perto para que o download acabe (o que é um rombo na segurança).
Com o uso do screen (que age como um shell), ambos os problemas teriam uma solução simples. Quando se está conectado e utiliza-se o screen e ocorre uma perda de conexão, ao reconectar voltamos a utilizar a mesma sessão de antes, permitindo assim continuar o trabalho de onde paramos. Da mesma forma, podemos desconectar do screen sem fechá-lo (mantendo a sessão ativa), e posteriormente ao reconectar todos os programas ainda estarão em execução. O screen permite ainda que duas pessoas de máquinas diferentes compartilhem a mesma sessão! Perfeito para mostrar a execução de uma tarefa a um amigo que não está no mesmo local que você.

Screen é apresentado no seu site como um gerenciador de janelas que multiplexa (divide) um único terminal virtual em vários. Na prática, ele permite que com apenas uma conexão SSH você abra vários terminais simultâneamente (similar à função das teclas F1, F2, F3 ... do console), além de outras funções muito úteis. Esse artigo visa ser uma pequena introdução às facilidades dessa incrível ferramenta.

Instalação
O screen faz parte da maioria das distribuições atuais. Em sistemas Debian (ou derivados, como Ubuntu e Kurumin) a instalação é bem simples: basta um
debian:~# apt-get install screen
e o programa será instalado, com todas as suas dependências.
Também é possível a instalação através do código fonte, mas isso foge do escopo desse artigo.
Após a instalação, crie (com o vi ou outro editor de texto de sua preferência) um arquivo chamado .screenrc no diretório $HOME do seu usuário (/home/usuario OU /root para o root) com o conteúdo abaixo:
msgwait 3 sorendition 00 43 hardstatus alwayslastline " %c | %d/%m/%Y | %w" bind h hardstatus ignore bind g hardstatus alwayslastline
Esse arquivo de configuração facilita o uso do screen, acrescetando uma barra azul na parte inferior da tela, com informações de data, hora e a lista de janelas, e destaca a janela atual com um asterisco. Caso hajam vários usuários que irão utilizar o screen, você pode definir estas opções diretamente no arquivo de configuração do screen (/etc/screenrc)

Utilizando


Para chamar o screen, basta digitar
debian:~# screen
e o mesmo já estará em execução. Se você criou o arquivo de configuração citado acima, verá uma tela semelhante a esta (clique nas imagens para ampliar):


Esta mensagem aparece sempre que o screen é iniciado, mas é possível desativar sua exibição setando a opção "startup_message off" no arquivo de configuração do sistema ou individualmente por  usuário (/etc/screenrc ou ~/.screenrc respectivamente). Conforme diz a mensagem, pressione ENTER para continuar.

A utilização do screen é vinculada à combinação de teclas CTRL+a, seguida da tecla que representa a função desejada. Para facilitar, vamos adotar a mesma notação utilizada pelo programa: ao invés de escrever CTRL+a, escreverei ^a. Algumas funções podem ser chamadas de mais de uma maneira. Para exibir as combinações de teclas e suas funções, digite ^a ? (^a e em seguida ?). Se possuir espaço suficiente na janela, todas as teclas serão exibidas, e bastar pressionar ENTER para sair da ajuda. Caso não haja espaço, as informações serão paginadas. Nesse caso, a barra de espaço avança para a próxima tela e  ENTER sai.

Vou listar abaixo algumas das combinações mais utilizadas.
Obs1: algumas combinações utilizam letras maiúsculas.
Obs2: caso você acidentalmente pressione ^a s, a tela deixará de ser atualizada, embora tudo o que você digite continue funcionando. Para normalizar isto, pressione ^a q.

^a a: envia um CTRL+a (use isso se você utilizar um programa que necessite da sequência de teclas CTRL+a e o screen estiver atrapalhando.
^a c: cria uma nova aba.
^a ^a: alterna entre as duas últimas abas acessadas.
^a número: vai direto para a aba de numero X, onde X é um número entre 0 e 9.
^a " (aspas duplas): mostra a lista de abas abertas e permite selecionar uma. Útil para casos em que há mais de 10 abas (sim, as vezes acontece comigo ...)
^a A: renomeia a aba atual.
^a S: divide a tela, empilhando as abas. Pressione ^a TAB para alternar entre as abas. É necessário criar uma aba no espaço recém criado (^a c) ou "puxar" uma aba já criada para esse espaço (^a ^a ou ^a número). É possível executar ^a S várias vezes de modo a obter várias divisões, cada uma com sua própria aba. Para voltar ao modo normal, pressione ^a Q
^a d: sai do screen, porém deixa todas as abas abertas e seus respectivos processos rodando normalmente.

Para listar as sessões abertas, digite:
debian:~# screen -ls
There are screens on:
        3193.pts-0.debian       (Detached)
        3216.pts-0.debian       (Attached)
2 Sockets in /var/run/screen/S-root.
A resposta acima mostra que existem duas sessões do screen ativas, sendo que uma está conectada (Attached), ou seja, está em uso, e a outra desconectada (Detached), seja porque a sessão foi perdida (devido a uma queda de conexão remota) ou simplesmente foi desconectada com "^a d".
Para reconectar uma sessão, digite
debian:~# screen -r XXXX
 Onde XXXX é o PID (process ID) da sessão, obtido com screen -ls como mostrado acima. Caso haja apenas uma sessão em uso, não é necessário informar o PID.

Algumas vezes, a sua conexão é encerrada mas o sistema não percebe isso, e continua exibindo sua conexão como Attached quando você executa o screen -ls, não permitindo que você reconecte. Para forçar o sistema a desconectar uma sessão neste estado, digite
debian:~# screen -D
[3193.pts-0.debian power detached.]
Isso vai forçar a desconexão, permitindo que você reconecte. Da mesma forma que a opção screen -r, você terá de informar um número PID caso haja mais de uma conexão. Obs: algumas vezes a desconexão forçada falha, sendo necessário "matar" (com o kill) o processo do screen.

Basicamente é isso. Na verdade, daria para ficar escrevendo muito mais sobre essa ferramenta, mas esse é o básico do seu funcionamento (que já deve atender as necessidades da maioria das pessoas). Uma ótima fonte de informações sobre o screen (e vários outros utilitários em modo texto) é o site do Aurélio Marinho Jargas http://aurelio.net/ - com destaque para a Coluna do Auréliohttp://aurelio.net/doc/coluna/ - onde o Guru esmiuça vários softwares em modo texto. Leitura obrigatória!!

4 comentários:

Vinnicius disse...

Para sair da tela dividida, creio que o comando é ^a Q (maiúsculo)...ou estou enganado?

Fabiano Pires disse...

Certíssimo. Já corrigi a postagem. Obrigado pela observação.

Vinnicius disse...

Existe algum jeito de colocar acentuação no screen?

Fabiano Pires disse...

Deve estar associado à codificação (ISO5599-1, UTF-8, etc). Se estiver utilizando o putty, veja se a codificação do putty bate com a do sistema. Veja em Window->Translation