Por que executar `killall init` como usuário me desconecta?

12

Em vários computadores executando o Ubuntu 14.XX, executei o comando "killall init" como usuário e fui desconectado imediatamente. Eu poderia fazer login novamente sem problemas. Por que é isso? O que está acontecendo nos bastidores?

EMBLEMA
fonte

Respostas:

21

Nos sistemas Upstart mais novos, um processo de inicialização da sessão é iniciado quando você faz login usando a GUI. Como o Ubuntu usa o Upstart, há um initprocesso para sua sessão. Teste usando pstree -ps $$um terminal:

$ pstree -ps $$
init(1)───lightdm(1741)───lightdm(9511)───init(9526)───/usr/bin/termin(9570)─┬─gnome-pty-helpe(9734)                                                                                                                                                                                  
                                                                             └──zsh(7944)

Portanto, quando você executa killall init, não está matando o initPID 1 (porque você não tem o privilégio), mas a sua sessão init, que seria o PID 9526 neste exemplo.

Como esse inité o processo de governança da sua sessão da GUI, matá-lo mata a sua sessão e, portanto, você é desconectado.

muru
fonte
Killall sempre envia o sinal para o parente mais próximo na árvore de processos? Se eu executasse o comando como root (com sudo, por exemplo), obteria o mesmo resultado ou um pânico no kernel?
Tim Seguine
1
@ TimSeguine Como o nome diz, ele é enviado a todos os processos com esse nome. BTW, algumas pessoas preferem pkillem vez de killallporque killallobras completamente diferentes em outros sistemas, como Solaris ...
glglgl
killallmata tudo. Daí o nome.
orion 28/01
1
@TimSeguine Envia para todos, mas se você é um usuário comum, não pode enviar sinais para processos de outros usuários. Portanto, isso afeta apenas o da sua própria árvore de processos.
Barmar 28/01
Rodar killall initcomo rootnão parece uma boa idéia - especialmente em um sistema útil - acho que initcausa pânico no kernel se ele morrer, porque não se destina a atingir um returnno final de seu mainloop de código.
SlySven