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.
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.
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!
One reply on “Como desvincular um programa da shell em que foi executado”
Excelentes dicas tenho encontrado em suas páginas. Embora já use o Linux por alguns anos, apenas agora começo a aventurar-me no uso do terminal e tentativa de abandonar o mouse. Aqui tenho encontrado recursos suficientes para iniciar essa árdua jornada.