Linux tux ninja

Como desvincular um programa da shell em que foi executado

Já desejou fechar a janela do console, mas tinha um programa rodando dentro dele, cujo funcionamento você não queria interromper?
Se a sua resposta é sim e você gostaria de conhecer um meio de solucionar esta situação, me acompanhe.
Neste texto, vou mostrar como enviar um aplicativo, em execução, para os bastidores do sistema (background) e desvinculá-lo da shell que estiver rodando no terminal.
Até agora, sabemos que ao executar um comando Linux, dentro de uma janela do console, ele é finalizado junto com a janela.
Linux tux

A abordagem, descrita no texto, permite se conectar a um servidor remoto, executar uma tarefa em segundo plano e mantê-la rodando, mesmo depois de fechar a sessão SSH.

Se o aplicativo estiver sendo executado em segundo plano, o resultado é o mesmo.
Uma sessão SSH, através da qual, você está rodando um processo em uma máquina remota também seria terminada, junto com o processo, ao fechar a janela do console.
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.
Se você quer que um processo continue rodando depois que a sessão do terminal tiver sido fechada, você precisa desconectá-lo “desta família”.

Como desvincular um processo do bash shell

Comece por interromper o processo que estiver em execução, com a combinação de teclas ‘Ctrl + z’.
Agora, execute o processo em segundo plano, com o comando bg.
Por último, desvincule o processo com o comando disown.
Veja um exemplo, usando o aplicativo gnome-disks:

gnome-disks &
[1] 13023
disown %1
exit

No exemplo acima, já comecei executando o aplicativo gnome-disks em segundo plano, o que me permitiu usar o comando disown, logo.
Ao dar o comando exit, a janela do terminal foi fechada, mas o aplicativo gnome-disks permaneceu aberto e em execução.
exemplo de uso do comando disown no Linux
O disown é um dos comandos embutidos da shell bash, cuja ação é não permitir que o SIGHUP chegue aos processos descendentes — o que lhes permitirá continuar em execução, mesmo depois que a shell tiver sido fechada.
Se você costuma usar o comando jobs, para obter uma lista dos processos em execução na shell de trabalho atual, saiba que o comando desapropriado (ou disowned), em execução no segundo plano, não irá aparecer na lista.
Você ainda poderá vê-lo com o ps aux.
O que importa é que é seguro fechar o terminal e, até mesmo, se desautenticar do sistema e terminar a sua sessão SSH — o comando continuará em execução.
Se você rodar o comando disown, sem qualquer argumento ou opção, ele irá entender que deve agir sobre o job mais recente na lista de processos.
Nem todas as shells irão ter suporte ao comando disown.
Ele existe no bash e no zsh.
Alternativamente, é possível desvincular um processo Linux da uma shell com o comando nohup.
Neste, caso, ele deve ser usado no lançamento do processo.

nohup gnome-disks &

A diferença básica entre este método e o anterior é que o disown previne que uma shell, ao ser fechada, envie sinais SIGHUP.
O segundo método já pré-configura o comando, a ser executado, para ignorar os sinais SIGHUP enviados por aquela shell.

Obrigado pela leitura!

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como “Rick and Morty” e “BoJack Horseman”.
Me siga no Twitter e vamos trocar ideias!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *