Reconectando processos de uma sessão SSH PDF Imprimir E-mail
Artigos - Linux
Escrito por Fernando Mercês   
Sáb, 31 de Janeiro de 2009 13:13

ssh

 

Muitos usuários do SSH reclamam que quando estão numa sessão SSH rodando um processo e esta sessão cai por algum motivo (geralmente falha na conexão com a internet), ao reconectar-se posteriormente, o processo que era executado ou foi morto pelo sistema, ou então continua em execução, mas não podemos mais colocá-lo em foreground (vê-lo, como se estivéssemos executando no terminal atual). Isto acontece porque o sistema mata processos que estão inativos e não estão conectados a nenhum terminal. No caso de processos em atividade plena, o sistema não mata, mas como o processo não está conectado a nenhum terminal, não conseguimos reutilizá-lo por vias normais. Este artigo mostrará como podemos previnir este problema utilizando de técnicas simples. Boa leitura!

 

O SSH (Secure SHell) é uma ferramenta extremamente útil e presente no dia-a-dia de administradores de sistemas baseados em Linux. Sua segurança e versatilidade conquistaram os usuários rapidamente. Existem clientes SSH para praticamente todos os sistemas operacionais existentes, incluindo o Windows. Além disso, ele oferece o serviço de transferência de arquivos entre o servidor e o cliente, utilizando o SFTP (Secure File Transfer Protocol), na mesma porta e com suporte a conexões concorrentes. É realmente incrível.

 

No entanto, algumas operações podem gerar pequenos problemas. Uma delas é quando conectamos um servidor SSH e iniciamos um download com o wget. Particularmente, uso isso diariamente. O problema está em quando a nossa conexão com o servidor SSH falha. Ao reconectar, o processo do wget continua ativo (o sistema não o mata porque ele está consumindo CPU) mas não podemos mais nos conectarmos a ele e, como conseqüência, não dá pra saber quanto tempo falta para terminar o download, nem verificar seu andamento. Este é apenas um exemplo, que nos deixa duas escolhas: deixar o wget executando até o término do download ou matar o processo e reiniciar.  No caso do wget, se usarmos a opção -c, continuaremos de onde ele parou, mas nem todos os servidores suportam o resume e além disso, não é uma solução muito elegante, uma vez que o processo já está lá. Será que não há nenhuma maneira de trazê-lo para o foreground? O problema é que o processo não foi posto em background, logo não há como conectá-lo em foreground por vias normais.

 

Vamos passo-a-passo demonstrar o problema. Primeiro, você se conecta num servidor SSH:

 

usuario@maquina:~$ ssh Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo.

Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. 's password:

Linux server 2.6.24-etchnhalf.1-686 #1 SMP Mon Sep 8 06:19:11 UTC 2008 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Jan 31 15:46:53 2009 from 200.212.33.14

Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :~$

 

 

Agora é hora de iniciar um download com o wget:

 

 

Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :~$ wget -c \

http://ubuntu.c3sl.ufpr.br/releases/intrepid/ubuntu-8.10-desktop-i386.iso
--15:54:45-- http://ubuntu.c3sl.ufpr.br/releases/intrepid/ubuntu-8.10-desktop-i386.iso
=> `ubuntu-8.10-desktop-i386.iso'
Resolving ubuntu.c3sl.ufpr.br... 200.236.31.1, 200.17.202.1
Connecting to ubuntu.c3sl.ufpr.br|200.236.31.1|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 732,766,208 (699M), 726,460,756 (693M) remaining [application/octet-stream]

0% [ ] 7,043,801 81.12K/s ETA 2:50:07

 

 

Neste ponto, se a conexão cair e voltarmos a nos reconectar, estamos num terminal livre, mas o processo do wget continuará em execução. Vamos ver:

 

 

Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :~$ ps aux

root 2330 0.0 0.0 1568 488 tty6 Ss+ 2008 0:00 /sbin/getty 38400 tty6
root 13912 0.0 0.1 2620 1244 ? Ss 2008 1:08 /usr/sbin/dhcpd3 -q eth1
fernando 21596 0.1 0.1 4872 1500 ? S 15:54 0:00 wget -c http://ubuntu.c3sl.ufpr.br/releases/intrepid/ubuntu-8.10-desktop-i386.iso
root 21653 0.0 0.2 7696 2296 ? Ss 15:57 0:00 sshd: fernando [priv]
fernando 21656 0.0 0.1 7696 1560 ? S 15:57 0:00 sshd: fernando@pts/2
fernando 21658 0.6 0.2 5300 2780 pts/2 Ss 15:57 0:00 -bash
fernando 21673 0.0 0.0 3424 976 pts/2 R+ 15:57 0:00 ps aux
root 22704 0.0 0.0 1568 492 tty1 Ss+ 2008 0:00 /sbin/getty 38400 tty1

root 32476 0.0 0.1 4924 1084 ? Ss Jan06 0:00 /usr/sbin/sshd

 

 

Vemos que o processo está rodando, mas não está conectado a nenhum terminal (perceba a o ponto de interrogação destacado). O download continua, mas não vemos mais informações sobre ele.


É aí que entra o screen. O screen é capaz de criar um terminal virtual conectado à um terminal físico e permite que você se reconecte ao terminal virtual que estava (resume na sessão). Você deve instalar o sreen no servidor SSH (e não no cliente) para possibilitar a reconexão de sessão. Em termos simples, vamos ver como funciona.

 

Conecte no servidor SSH e instale o screen (ele está presente na maioria dos repositórios de distribuições, logo, você pode usar o apt-get, urpmi, zypper, etc, dependendo da sua distro), basta chamá-lo pelo nome:

 

 

Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :~$ screen

 

 

Ele exibirá esta tela:

 

 

Screen version 4.00.03 (FAU) 23-Oct-06

Copyright (c) 1993-2002 Juergen Weigert, Michael Schroeder
Copyright (c) 1987 Oliver Laumann

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with
this program (see the file COPYING); if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

Send bugreports, fixes, enhancements, t-shirts, money, beer & pizza to
Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo.


[Press Space or Return to end.]

 

 

 

Pressionando a tecla [ENTER] ou a barra de espaços, um shell comum será aberto. É nele que devemos iniciar as tarefas, por exemplo, um download com o wget:

 

 

Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :~$ wget -c http://ubuntu.c3sl.ufpr.br/releases/intrepid/ubuntu-8.10-server-i386.iso
--16:14:55-- http://ubuntu.c3sl.ufpr.br/releases/intrepid/ubuntu-8.10-server-i386.iso
=> `ubuntu-8.10-server-i386.iso'
Resolving ubuntu.c3sl.ufpr.br... 200.236.31.1, 200.17.202.1
Connecting to ubuntu.c3sl.ufpr.br|200.236.31.1|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 668,274,688 (637M), 668,175,636 (637M) remaining [application/octet-stream]

0% [ ] 1,168,603 87.63K/s ETA 2:18:33

 

 

Se a conexão do cliente com o servidor SSH cair, você pode reconectar ao servidor. Nele, estará rodando uma sessão do screen e para voltar a ela, basta reconectar-se, assim:

 

 

Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :~$ screen -r

 

 

Pronto! Você estará conectado à um terminal onde o wget está rodando e ativo e saberá todas as informações do seu download em tempo real, como se a conexão não tivesse sido perdida.

 

Se houver mais de uma sessão do screen aberta, ele perguntará em qual você deseja se conectar e bastará adicionar o PID da sessão ao final do comando acima para conectar-se à ela.

 

O screen virtualiza um terminal, logo, qualquer aplicativo pode ser executado nele. Aliás, há maneiras de colocá-lo como daemon para iniciar junto com o sistema, mas para o caso do SSH, basta que seja iniciado quando uma sessão SSH for aberta.