-
Por "fechar o shell", suponho que você queira fechar o
lxterminaljanela. Olxterminale obashinterativos estão conectados a uns aos outros através de um dispositivo pseudo-TTY, que é um nível de kernel construir.Se você fizer isso enquanto o processo filho
bashinterativo ainda estiver em execução, o processolxterminalfechará seu lado do pseudo-TTY. Isso faz com que o kernel envie um sinal SIGHUP para o interativobash.O capítulo SIGNALS de
man bashdiz:The shell exits by default upon receipt of a SIGHUP. Before exiting, an interactive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are sent SIGCONT to ensure that they receive the SIGHUP.
To prevent the shell from sending the signal to a particular job, it should be removed from the jobs table with the
disownbuiltin (see SHELL BUILTIN COMMANDS below) or marked to not receive SIGHUP usingdisown -h.O significado pretendido do sinal SIGHUP é "a conexão com o terminal do usuário foi perdido; salve qualquer trabalho não salvo, se necessário, e então saia de forma ordenada. "(Para processos daemon, isto não é aplicável, então, para eles, o sinal é freqüentemente usado para significar "reler seus arquivos de configuração "e / ou" fecha e reabre seus arquivos de log para rotação de log ".)
Como diz a página man, o
bashinterativo reenviará o SIGHUP sinal para todos os seus filhos (a menos que seja dito o contrário usando %código%). Isso é o que faz com que seudisownem segundo plano saia. -
Mas quando você usa um script , seu shell interativo
evinces a novo processo para executar um shell para executar o script e, em seguida, o novo shell executando o scriptfork()s novamente para executarfork(). Depois disso, o script termina, então o shell executando o script sai.Neste ponto, o processo
evincenão terá mais um pai processo. Mas quando você olha para uma listagemevince, nunca há processo com um campo PPID vazio: é impossível para o processo não ter um pai . Então, para lidar com essa situação, o kernel atribui o PPID órfãops -efdo processo a 1, tornando-o filho adotado do processoevince. Agora o interativo originalinitnão sabe que a instância debashque executou o script começou outro processo: este conhecimento morreu junto com o shell instância que executou o script.Como resultado, o
bashinterativo simplesmente não faz ideia de que existe um processobashque pode precisar ter SIGHUP enviado para ele quando a sessão termina.O que você conseguiu com esse roteiro é, na verdade, o esqueleto versão de uma técnica usada quando intencionalmente daemonizing processos, conhecido como um garfo duplo . (Daemonizing a process = making completamente independente do processo e sessão que começou isso.)
Como você viu, na prática, isso é suficiente para fazer a
evinceprocesso separado doevinceinterativo, mas ainda mantendo um parte de sua sessão de login da GUI. Mas se você quer um completo daemonização, há alguns outros passos que você deve fazer antes do segunda forquilha:- certifique-se de que a entrada padrão, a saída padrão e o erro padrão sejam redirecionados para
bash - se algum outro descritor de arquivos estiver aberto, feche-o
-
/dev/nullpara que seu processo não interfira acidentalmente com o sysadmin montando / desmontando sistemas de arquivos, a menos que o processo realmente precisa acessar arquivos em um determinado sistema de arquivos - defina
cd /explicitamente como o valor desejado / necessário - se o comando
umaskestiver disponível, você deverá usá-lo para desconectar o processo resultante do grupo de processos da sessão e torná-lo totalmente separado (ou seja, em vez desetsidno final do seu script, você pode usarevince &).
Veja aqui uma descrição mais detalhada de daemonizing no bash shell: link
- certifique-se de que a entrada padrão, a saída padrão e o erro padrão sejam redirecionados para