Pesquisa de site

5 maneiras de manter sessões e processos SSH remotos em execução após a desconexão


SSH ou Secure Shell em termos simples é uma forma pela qual uma pessoa pode acessar remotamente outro usuário em outro sistema, mas apenas na linha de comando, ou seja, no modo não GUI. Em termos mais técnicos, quando fazemos ssh para outro usuário em algum outro sistema e executamos comandos nessa máquina, ele na verdade cria um pseudoterminal e o anexa ao shell de login do usuário logado.

Quando saímos da sessão ou a sessão expira após ficar inativa por algum tempo, o sinal SIGHUP é enviado ao pseudo-terminal e a todos os trabalhos que foram executados nesse terminal, mesmo os trabalhos que têm seus trabalhos pais sendo iniciados no pseudoterminal também recebem o sinal SIGHUP e são forçados a encerrar.

Não perca: 5 práticas úteis para manter o servidor SSH seguro e protegido

Somente os trabalhos que foram configurados para ignorar este sinal são aqueles que sobrevivem ao encerramento da sessão. Em sistemas Linux, podemos ter várias maneiras de executar esses trabalhos no servidor remoto ou em qualquer máquina, mesmo após o logout do usuário e o encerramento da sessão.

Entenda os processos no Linux

Processo Normal

Processos normais são aqueles que duram a vida de uma sessão. Eles são iniciados durante a sessão como processos em primeiro plano e terminam em determinado intervalo de tempo ou quando a sessão é desconectada. Esses processos têm como proprietário qualquer usuário válido do sistema, incluindo root.

Processo Órfão

Processos órfãos são aqueles que inicialmente tinham um pai que criou o processo, mas depois de algum tempo, o processo pai morreu ou travou involuntariamente, tornando o init o pai desse processo. Tais processos têm o init como pai imediato, que espera por esses processos até que eles morram ou acabem.

Processo Daemon

Esses são alguns processos intencionalmente órfãos; esses processos que são intencionalmente deixados em execução no sistema são denominados daemon ou processos intencionalmente órfãos. Geralmente são processos de longa execução que são iniciados e depois desconectados de qualquer terminal de controle para que possam ser executados em segundo plano até que não sejam concluídos ou acabem gerando um erro. O pai de tais processos morre intencionalmente, fazendo com que o filho seja executado em segundo plano.

Técnicas para manter a sessão SSH em execução após a desconexão

Pode haver várias maneiras de deixar sessões ssh em execução após a desconexão, conforme descrito abaixo:

1. Usando o comando screen para manter sessões SSH em execução

screen é um gerenciador de janelas de texto para Linux que permite ao usuário gerenciar múltiplas sessões de terminal ao mesmo tempo, alternando entre sessões, registrando sessões para as sessões em execução na tela e até mesmo retomando a sessão a qualquer momento que desejarmos sem se preocupar com o encerramento da sessão ou o fechamento do terminal.

sessões de tela podem ser iniciadas e depois desconectadas do terminal de controle, deixando-as rodando em segundo plano e depois retomadas a qualquer momento e até mesmo em qualquer lugar. Basta iniciar sua sessão na tela e quando quiser, desconectá-la do pseudo-terminal (ou terminal de controle) e sair. Quando sentir, você pode fazer login novamente e retomar a sessão.

Iniciando uma sessão de tela

Após digitar o comando 'screen', você estará em uma nova sessão de tela, dentro desta sessão você poderá criar novas janelas, navegar entre janelas, bloquear a tela e fazer muitas outras coisas que você pode fazer em um terminal normal.

screen

Depois que a sessão de tela for iniciada, você poderá executar qualquer comando e manter a sessão em execução desanexando a sessão.

Desanexando uma tela

Apenas quando você deseja sair da sessão remota, mas deseja manter viva a sessão que criou naquela máquina, então o que você precisa fazer é desconectar a tela do terminal para que não haja mais nenhum terminal de controle. Depois de fazer isso, você pode sair com segurança.

Para desvincular uma tela do terminal remoto, basta pressionar “Ctrl+a ” imediatamente seguido de “d ” e você estará de volta ao terminal vendo a mensagem de que a Tela está desapegado. Agora você pode sair com segurança e sua sessão permanecerá ativa.

Retomando sessão de tela separada

Se você quiser retomar uma sessão de tela separada da qual você saiu antes de sair, basta fazer login novamente no terminal remoto e digitar “screen -r ” caso apenas uma tela seja aberta e se várias sessões de tela são abertas, execute “screen -r .

screen -r
screen -r <pid.tty.host>

Para saber mais sobre o comando screen e como usá-lo basta seguir o link: Use o comando screen para gerenciar sessões de terminal Linux

2. Usando Tmux (Terminal Multiplexer) para manter sessões SSH em execução

Tmux é outro software criado para substituir a tela. Ele possui a maioria dos recursos da tela, com poucos recursos adicionais que o tornam mais poderoso que a tela.

Ele permite, além de todas as opções oferecidas pela tela, dividir painéis horizontalmente ou verticalmente entre várias janelas, redimensionar painéis de janelas, monitorar atividades de sessão, criar scripts usando modo de linha de comando, etc. Devido a esses recursos do tmux, ele tem desfrutado de ampla adoção por quase todas as distribuições Unix e até mesmo foi incluído no sistema básico do OpenBSD.

Iniciar uma sessão Tmux

Depois de fazer ssh no host remoto e digitar tmux, você entrará em uma nova sessão com uma nova janela aberta à sua frente, onde você poderá fazer qualquer coisa que faria em um terminal normal.

tmux

Depois de realizar suas operações no terminal, você pode desconectar essa sessão do terminal de controle para que ela entre em segundo plano e você possa sair com segurança.

Desconectar sessão Tmux do Terminal

Você pode executar “tmux detach ” ao executar a sessão tmux ou pode usar o atalho (Ctrl+b e d). Depois disso, sua sessão atual será desconectada e você retornará ao seu terminal, de onde poderá sair com segurança.

tmux detach

Retomando a sessão fechada do Tmux

Para reabrir a sessão que você desconectou e deixou como estava quando saiu do sistema, basta fazer login novamente na máquina remota e digitar “tmux attachment ” para reconectar à sessão fechada e ela ainda estará lá e funcionando.

tmux attach

Para saber mais sobre o tmux e como usá-lo basta seguir o link: Use o Tmux Terminal Multiplexer para gerenciar vários terminais Linux.

3. Usando o comando nohup para continuar executando sessões SSH

Se você não está familiarizado com screen ou tmux, você pode usar nohup e enviar seu comando de longa execução para segundo plano para que você possa continuar enquanto o comando continuará sendo executado em segundo plano. Depois disso, você pode sair com segurança.

Com o comando nohup dizemos ao processo para ignorar o sinal SIGHUP que é enviado pela sessão ssh no encerramento, fazendo com que o comando persista mesmo após o logout da sessão. No logout da sessão, o comando é desconectado do terminal de controle e continua sendo executado em segundo plano como processo daemon.

Executando comando usando nohup em segundo plano

Aqui está um cenário simples em que executamos o comando find para procurar arquivos em segundo plano na sessão ssh usando nohup, após o qual a tarefa foi enviada para segundo plano com prompt retornando imediatamente fornecendo PID e trabalho ID do processo ([JOBID] PID).

nohup find / -type f $gt; files_in_system.out 2>1 &

Retomando a sessão para ver se o trabalho ainda está em execução

Ao fazer login novamente, você pode verificar o status do comando, trazê-lo de volta ao primeiro plano usando 'fg %JOBID' para monitorar seu progresso e assim por diante. Abaixo, a saída mostra que o trabalho foi concluído, pois não aparece no novo login e fornece a saída que é exibida.

fg %JOBID

4. Usando o comando disown para manter as sessões SSH em execução

Outra maneira elegante de permitir que seu comando ou uma única tarefa seja executada em segundo plano e permaneça ativa mesmo após o logout ou desconexão da sessão é usar disown.

Disown, remove o trabalho da lista de trabalhos de processo do sistema, de modo que o processo fica protegido contra ser eliminado durante a desconexão da sessão, pois não receberá SIGHUP pelo shell quando você sai.

A desvantagem deste método é que ele deve ser usado apenas para trabalhos que não necessitam de nenhuma entrada do stdin e nem precisam escrever no stdout, a menos que você redirecione especificamente entrada e saída de jobs, porque quando o job tentar interagir com stdin ou stdout, ele será interrompido.

Executando comando usando disown em segundo plano

Abaixo, enviamos o comando ping para segundo plano para que ut continue em execução e seja removido da lista de tarefas. Como visto, o trabalho foi suspenso primeiro, após o que ainda estava na lista de trabalhos como ID do processo: 15368.

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

Depois disso, o sinal de rejeição foi passado para o trabalho e ele foi removido da lista de trabalhos, embora ainda estivesse em execução em segundo plano. O trabalho ainda estaria em execução quando você fizesse login novamente no servidor remoto, conforme mostrado abaixo.

ps -ef | grep ping

5. Usando o comando setsid para colocar sessões SSH em execução

Outro utilitário para alcançar o comportamento requerido é o setsid. Nohup tem uma desvantagem no sentido de que o grupo de processos do processo permanece o mesmo, então o processo em execução com nohup é vulnerável a qualquer sinal enviado para todo o grupo de processos (como Ctrl + C).

setsid por outro lado, aloca um novo grupo de processos para o processo que está sendo executado e, portanto, o processo criado está totalmente em um grupo de processos recém-alocado e pode ser executado com segurança, sem medo de ser eliminado, mesmo após o logout da sessão.

Execute qualquer comando usando setsid

Aqui mostra que o processo ‘sleep 10m’ foi desconectado do terminal de controle, desde o momento em que foi criado.

setsid sleep 10m
ps -ef | grep sleep

Agora, ao fazer login novamente na sessão, você ainda encontrará esse processo em execução.

ps -ef | grep [s]leep

Conclusão

Que maneiras você poderia imaginar para manter seu processo em execução mesmo depois de sair da sessão SSH? Se houver alguma outra maneira eficiente que você possa imaginar, mencione em seus comentários.