Dlaczego uruchamianie polecenia „killall init” jako użytkownik wylogowuje mnie?

12

Na wielu komputerach z systemem Ubuntu 14.XX uruchomiłem polecenie „killall init” jako użytkownik i natychmiast się wylogowałem. Mogę zalogować się ponownie bez problemu. Dlaczego to? Co dzieje się za kulisami?

GODŁO
źródło

Odpowiedzi:

21

W nowszych systemach Upstart proces inicjowania sesji rozpoczyna się po zalogowaniu za pomocą GUI. Ponieważ Ubuntu używa Upstart, istnieje initproces dla twojej sesji. Przetestuj za pstree -ps $$pomocą terminala:

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

Kiedy więc biegniesz killall init, nie zabijasz initPID 1 (ponieważ nie masz uprawnień), ale twoją sesję init, która w tym przykładzie byłaby PID 9526.

Ponieważ initjest to proces rządzący sesją GUI, zabicie go zabija sesję i dlatego jesteś wylogowany.

muru
źródło
Czy killall zawsze wysyła sygnał do najbliższego krewnego w drzewie procesów? Gdybym uruchomił polecenie jako root (na przykład z sudo), czy uzyskałbym ten sam wynik, czy panikę jądra?
Tim Seguine
1
@TimSeguine Jak sama nazwa wskazuje, jest wysyłany do wszystkich procesów o tej nazwie. BTW, niektórzy wolą pkillzamiast, killallponieważ killalldziała zupełnie inaczej w innych systemach, takich jak Solaris ...
glglgl
killallzabija wszystkich. Stąd nazwa.
orion
1
@ TimSeguine Wysyła do wszystkich, ale jeśli jesteś zwykłym użytkownikiem, nie możesz wysyłać sygnałów do procesów innych użytkowników. Tak więc wpływa tylko na ten z twojego drzewa procesów.
Barmar
Uruchamianie, killall initjak rootsię wydaje, nie jest dobrym pomysłem - szczególnie w przydatnym systemie - myślę, że initpowoduje panikę jądra, jeśli umrze, ponieważ nie jest przeznaczone do osiągnięcia returnkońca mainpętli kodu.
SlySven,