Почему запуск `killall init` как пользователь выходит из меня?

12

На нескольких компьютерах под управлением Ubuntu 14.XX я запустил команду «killall init» как пользователь, и меня сразу же вышли из системы. Я мог бы войти снова без проблем. Почему это? Что происходит за кулисами?

ЭМБЛЕМА
источник

Ответы:

21

В более новых системах Upstart процесс инициализации сеанса запускается при входе в систему с помощью графического интерфейса. Так как Ubuntu использует Upstart, есть initпроцесс для вашего сеанса. Проверьте это с помощью pstree -ps $$терминала:

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

Поэтому, когда вы запускаете killall init, вы убиваете не initPID 1 (потому что у вас нет привилегии), а ваш сеанс init, который в данном примере будет PID 9526.

Так как это initосновной процесс для вашего сеанса GUI, его уничтожение убивает ваш сеанс, и поэтому вы вышли из системы.

Мур
источник
Всегда ли killall отправляет сигнал ближайшему родственнику в дереве процессов? Если бы я выполнил команду как root (например, с sudo), получу ли я такой же результат или панику ядра?
Тим Сегин
1
@TimSeguine Как следует из названия, оно отправляется всем процессам с этим именем. Кстати, некоторые люди предпочитают, pkillа не killallпотому, что killallработает совершенно по-другому на других системах, таких как Solaris ...
glglgl
killallубивает всех Отсюда и название.
Орион
1
@TimSeguine Он отправляет всем, но если вы обычный пользователь, вы не можете отправлять сигналы процессам других пользователей. Так что это влияет только на один в вашем собственном дереве процессов.
Бармар
Запуск killall initкак rootне кажется хорошей идеей - особенно в полезной системе - я думаю, что initвызывает панику ядра, если оно умирает, потому что оно не предназначено для достижения когда-либо returnв конце своего mainцикла кода.
SlySven