Saiba como manter um comando executando mesmo depois de encerrar uma sessão remota SSH

comando-execucao-encerrar-ssh-linuxdescomplicado

Supondo que esteja acessando um outro sistema remotamente via SSH e deseja executar um comando que leva muito tempo para terminar e, em seguida, precise sair sessão SSH. Como deixar o comando em execução mesmo se você não estiver mais conectado com o sistema remoto? É simples, mas já deve ter percebido que ao encerrar uma sessão SSH todos os trabalhos em execução serão encerrados também. Então, saiba como manter um comando executando mesmo depois de encerrar uma sessão remota SSH.

Contextualizando

Todo comando linux executado cria um processo em execução no sistema. Diante disso, afirmo que, basicamente, os processos podem ser executados de duas formas: em foreground (primeiro plano) ou background (segundo plano).

foreground-background-linux

Os processos executado em foreground são aqueles que necessitam de interação direta com o usuário, incluindo troca de informações e “exclusividade” da console de terminal. Por outro lado, os processo em background não necessitam desta interação com o usuário, permanecendo em execução mesmo sem a interação do usuário e liberando a console de terminal para outras as atividades, por exemplo.

Essa possibilidade é fundamental para um bom controle da execução dos processos iniciados pelo usuário do sistema. Pois, muitas vezes é preciso passar um processo que está sendo executado em primeiro plano (foreground) para segundo plano (background) e/ou vice-versa. Por exemplo, numa sessão de transferência de arquivos entre máquinas remotas, o tempo de transferência pode levar horas. Neste caso, seria interessante “passar” o processo para segundo plano, liberando a shell para outras atividades do usuário – caso não queira iniciar outra console de terminal :)

Isto é muito bom quando temos acesso direto ao terminal local. Contudo, no cenário de acesso remoto via SSH, mesmo o processo sendo executado em segundo plano, o resultado é ao encerrar a sessão SSH o processo também seja encerrado – perdendo todo o trabalho feito por ele :(

Isto acontece por que uma shell, que é o processo pai de todos os outros que estejam rodando em segundo plano — no terminal ou na sessão SSH – envia um SIGINT a todos os seus processos filhos, antes de ela mesma se finalizar. Via EliasPraciano

Manter processo em execução numa sessão SSH

AVISO
Toda as vezes que eu referenciar a shell Linux estou falando do bash. Pois, ela foi usado para os exemplos contidos nesse tutorial.

O comando a ser mostrado será o wget – realiza download de dados da web.

O objetivo desse tutorial é executar uma tarefa em segundo plano e mantê-la ativa, mesmo depois de encerrar a sessão SSH. Portanto, é preciso ter uma máquina virtual ou sistema remoto para acessar via SSH para pôr em prática os exemplos.

Assim, apresento alguns métodos:

1 – Nohup

No hangup (Nohup) é um utilitário de linha de comando que mantém em execução comandos do Linux mesmo depois de desconectar sessões remotas SSH. Como ele faz parte do GNU coreutils você não precisa instalá-lo. Ele vem pré-instalado em todas as distribuições Linux :)

O uso é simples e fácil. Depois de entrar no seu sistema remoto via SSH, tudo o que você precisa fazer é:

nohup wget http://mirror.waia.asn.au/ubuntu-releases/xenial/ubuntu-16.04.2-desktop-amd64.iso &

Onde, você antecede ao comando desejado (no caso wget) o utilitário nohup. No final do comando, você usa o ‘&’ para indicar que o processo será executado em segundo plano (background). Durante a execução do comando um arquivo chamado ‘nohup.out’ é criado. Ele contém os logs de execução do comando.

Pronto!! Agora, você pode sair da sessão SSH. O comando remoto continuará funcionando até concluir sua tarefa – no caso baixar a imagem ISO do Ubuntu :)

Para mais informações sobre o comando nohup consulte a documentação oficial (man nohup)

2 – Screen

O screen é um multiplexador de terminais que permite ao usuário, em uma mesma sessão, abrir várias janelas e realizar atividades paralelas. Ou seja, as “janelas que ele cria” estão dentro de uma mesma sessão e isso é muito útil. Por exemplo, numa única sessão remota via SSH, várias sessões virtuais poderão ser iniciadas em conjunto.

Caso não esteja disponível em seu sistema Linux, a ferramenta screen poderá ser instalada através do comando:

Para Debian e derivados:

apt-get install screen

Para RedHat e derivados:

yum install screen

Assim, depois de instalado e sabendo que precisa realizar um download via wget e não pode esperá-lo concluir para fazer outra tarefa por estar em uma conexão SSH, por exemplo, abra uma sessão utilizando o comando abaixo:

screen

Posteriormente, inicie o download do arquivo em questão:

wget http://mirror.waia.asn.au/ubuntu-releases/xenial/ubuntu-16.04.2-desktop-amd64.iso

Enquanto o download é feito, você deve pressionar as teclas CTRL+A+D. Essa combinação de teclas fará com que essa sessão virtual seja “separada” (detached) da sessão original; liberando por consequência o terminal para realização de outra tarefa:

[detached from 13223.pts-0.ricardo@localhost]
ricardo@localhost ~ $

Assim, para listar as sessões abertas execute o comando:

screen -ls

Diante dessa situação, caso sua conexão SSH falhe ou precise encerrá-la; basta você reconectar e executar o comando anterior (screen -ls) para ter uma visão de quantas sessões estão criadas.

Por fim, depois de “separar” (detach) a janela (screen); você desejará restaurar a sessão para saber se seu download está concluído. Para essa operação, execute o comando:

screen -r

E para retornar ao terminal “real” execute exit.

Para mais informações sobre o comando screen consulte a documentação oficial (man screen) ou AQUI.

Por fim, como opção semelhante ao screen existe o tmux. Caso queira conhecê-lo, veja AQUI :)


Via | OsTechNix

Ricardo Ferreira

Ricardo Ferreira

Fundador do Linux Descomplicado - LD.

Sempre em busca de novos conhecimentos, preza por conteúdo de qualidade e auto-explicativo. Por isso, persiste em criar um site com artigos relevantes para todos os leitores do Linux Descomplicado!
Ricardo Ferreira

Comentários

comentários

Desenvolvedor ou Sysadmin? Leia isso...

Docker é uma plataforma para desenvolvimento, provisionamento e execução de aplicações usando tecnologia de containers.

Se você é um desenvolvedor ou sysadmin você poderá ter diversas vantagens usando a plataforma Docker:
  • Desenvolve uma vez...executa em qualquer lugar;
  • Sem preocupações (dependências e/ou pacotes)... foco no desenvolvimento;
  • Elimina inconsistências na entrega das aplicações e/ou serviços;;
  • Evita o “localhost funciona”;
  • Promove uma infraestrutura escalável;

Conheça o Curso Docker - Introdução a administração de containers. Ele é introdutório a plataforma Docker e lhe dará melhor compreensão sobre as vantagens da ferramenta.


Inscreva-se agora (50% OFF) »

VOCÊ TAMBÉM PODERÁ LER...

  • Vegan Garo

    Sou novato e aprendi a usar Tmux…ja era haha

  • Luiz Antonio Carlin

    MAs e se a situação for diferente: Deixei um comando rodando e me esqueci do Nohup. E para piorar, a minha sessão tem Time-out que faz com que ela caia depois de uns 20 ou 30 m
    O que fazer nesse Caso?
    Ja tentei + z e depois ” bg ” mas em alguns casos percebi que o comando para..