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).
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 🙁
Saiba como executar aplicações gráficas remotamente através de uma conexão SSH
Saiba como copiar um disco de uma máquina para outra via SSH
Saiba como realizar backup incremental usando a ferramenta rsync via ssh
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
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 🙂
Conheça todos os elementos que formam a estrutura do sistema Linux
O uso é simples e fácil. Depois de entrar no seu sistema remoto via SSH, tudo o que você precisa fazer é:
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.
Administrando múltiplos terminais virtuais usando a ferramenta screen
Caso não esteja disponível em seu sistema Linux, a ferramenta screen poderá ser instalada através do comando:
Para Debian e derivados:
Para RedHat e derivados:
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:
Posteriormente, inicie o download do arquivo em questão:
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:
Assim, para listar as sessões abertas execute o comando:
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:
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
Sou novato e aprendi a usar Tmux…ja era haha
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..