Por que alguns programas em execução no Terminal usando '&' fecham quando o Terminal fecha e outros não?

27

Eu só estava pensando, por exemplo, quando lancei qtoxcom:

qtox &

E então feche o Terminal, qtoxfeche com ele. No entanto, ao executar etherapeusando:

sudo etherape &

O fechamento do terminal não fecha ou causa qualquer problema ao Etherape. E entre aplicações diferentes, há um comportamento diferente, algumas fecham quando o Terminal faz, outras não, como é que acontece? Por que alguns fecham quando outros não? Estou executando o Ubuntu GNOME 15.10 com o GNOME 3.18.

kos
fonte
1
Pode ser que você abra um terminal, execute qtox, feche o terminal, tudo o que você !! Mas o segundo vai abrir o terminal, o sudo executa o etherape, agora você fecha o terminal, mas o sudo continua funcionando até o sudo fechar?
Ken Mollerup
Bem, se você não quiser qtoxsair ao fechar o terminal, sempre poderá executá-lo nohup qtox &.
Terrance
@Terrance: Bem, esta pergunta eu estava pedindo especificamente por isso, e não como ... Isso seria minha outra pergunta ... :)
1
@ParanoidPanda Ah, bom ponto. Minha culpa. =)
Terrance

Respostas:

36

Quando você fecha um terminal, o terminal envia um sinal SIGHUP para o shell; o shell, por sua vez, envia um sinal SIGHUP para todos os seus grupos de processos filhos, que incluem grupos de processos em segundo plano;

Como cada processo único reagirá ao sinal depende inteiramente do processo: se o processo não definiu um manipulador para o sinal e disse ao kernel (através de algum syscall como signal()ou sigaction()) que deseja lidar com ele, o kernel executa o manipulador padrão do sinal, que no caso de um sinal SIGHUP consiste em finalizar o processo.

No entanto, quando você executa um comando com sudo, o UID do sudoprocesso e seu processo filho é definido como 0(raiz); em geral, a menos que o UID do processo que está enviando o sinal seja 0(raiz) ou igual ao processo de destino, o kernel descartará o sinal (ou seja: um processo não pode enviar sinais para um processo pertencente a outro usuário, a menos que o processo o envio do sinal pertence à raiz); é por isso que um processo executado pelo usuário, como a instância Bash executada pelo terminal, não pode SIGHUP um sudoprocesso e, finalmente, fechar um terminal não afeta o processo iniciado sudo.

kos
fonte
7
E é por isso que precisamos nohupdiante dos comandos que se aproximam do SIGHUP :) Atualizada
Sergiy Kolodyazhnyy 30/11/2015
9
Eu acho que não há nada mágico sudo. sudoapenas executa o comando como outro usuário e você não pode enviar sinal para os processos de outros usuários. Veja man 2 kill.
El.pescado 30/11/2015
@ el.pescado Então, é sudoalgum tipo de homem pobre nohup?
Hagen von Eitzen
7
@HagenvonEitzen Se você quiser, mas eu gostaria altamente abster-se de executar um comando que não requer sudocom sudopor seu nohupefeito colateral, consideradas todas as outras desvantagens.
kos
2
@Serg não precisamos nohup, ele cria nohup.outarquivos desnecessários depois dele. Em vez disso, use o disowncomando embutido.
Ruslan