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 grupos de processos filhos, que incluem grupos de processos em segundo plano;
Como cada processo irá reagir ao sinal é inteiramente para o processo: se o processo não definiu um manipulador para o sinal e dizer ao kernel (via alguns syscall como signal()
ou sigaction()
) que deseja manipulá-lo, o kernel executa o manipulador padrão para o sinal, que no caso de um sinal SIGHUP consiste em terminar o processo.
No entanto, quando você executa um comando com sudo
, o UID do processo sudo
e seu processo filho são definidos como 0
(root); em geral, a menos que o UID do processo que envia o sinal seja 0
(root) ou o mesmo que o processo de destino, o kernel descarta o sinal (isto é: um processo não pode enviar sinais para um processo de outro usuário, a menos que o processo que envia o sinal seja de propriedade de root); é por isso que um processo executado pelo usuário, como a instância Bash executada pelo terminal, não pode processar SIGHUP a sudo
e, em última análise, fechar um terminal não afeta um processo iniciado com sudo
.