Что происходит, когда я нажимаю «Выключить» из графического интерфейса?

15

Я уже давно бьюсь головой об этом. Это связано с этим вопросом . Я хотел бы выяснить, что именно происходит, когда я решаю закрыть окно Linux из графического интерфейса. Это, кажется, плохо (если вообще) задокументировано.

В идеале я надеюсь на независимый от DE и OS ответ. За исключением этого, меня интересует конкретный случай Mandriva 2010.1 и Debian 6.x (Squeeze) и 7.0 (Wheezy), на которых работает Gnome. (Если вы уделяете пристальное внимание, да, это Гном 2 и Гном 3)

В основном, я хотел бы знать, какая команда / скрипт / последовательность скриптов запускается, когда я нажимаю «Завершение работы» или «Перезапуск», чтобы я мог изменить их поведение. Некоторые сообщения на форуме, на которые я смотрел, предлагают взломать, /etc/polkit-1/*но эта структура каталогов, к примеру, является всего лишь каркасом в моем окне Debian (Squeeze).

Кто-нибудь может помочь?


РЕДАКТИРОВАТЬ

Что я пробовал до сих пор

  • Заменил shutdownисполняемый файл на мой собственный скрипт. Это не работает: когда я нажимаю shutdownGnome выходит из системы без выполнения моего сценария.
  • Пробовал редактировать меню Gnome 2. Радости нет: параметры «Завершение работы», «Выход из системы» и «Блокировка экрана» не отображаются в редакторе меню.
  • Посмотрел /usr/share/menu, ничего полезного там нет.

Возможные пути решения

  • straceиспользование параметров графического интерфейса (это вообще возможно?)
  • Глядя на shutdownисходный код
  • Глядя на gnome-sessionисходный код

Обновить

Согласно моим комментариям к ответу ниже, я изучил polkitдействия в /usr/share/polkit-1/actions/и нашел (в файле org.freedesktop.consolekit.policy) вызванное действие, org.freedesktop.consolekit.system.stop-multiple-usersкоторое выбрасывает сообщение

System policy prevents stopping the system when other users are logged in

Я думаю (из-за org.freedesktop.*соглашения об именах), что это какой-то сигнал, посылаемый DM через D-BUS. Кроме того, это сообщение появляется при попытке графически завершить работу, когда другие пользователи вошли в систему, поэтому механизм, который его запускает, должен быть тем же механизмом, который запускается при выборе «Выключить» или «Выключить» в графическом интерфейсе.

Кто-нибудь может подтвердить / опровергнуть? Есть ли возможность как-то перехватить этот сигнал или изменить его?

Джозеф Р.
источник
Что вы пытаетесь достичь? Вы можете добавить редактирование /etc/init.d/rc.localдля вызова скрипта при остановке .
depquid
@depquid То, что я пытаюсь выполнить, находится в моем более старом вопросе, с которым я связался: я пытаюсь предотвратить локальный вход пользователя в систему, чтобы засорять сеанс SSH другого пользователя.
Джозеф Р.

Ответы:

9

Это зависит от вашего диспетчера отображения! (т.е. KDM, GDM)

Пожалуйста, имейте в виду, что ваша DM работает как root! (ему нужны привилегии суперпользователя для запуска процесса сеанса от имени пользователя, в который вы входите)

Когда вы нажимаете кнопку выключения в KDE или GNOME, ваш DE посылает сигнал вашему DM для выключения или перезапуска после завершения сеанса. Затем ваш DE сообщает каждой программе об окончании, и как только все другие процессы завершаются (или истекает тайм-аут), последний процесс вашего DE - процесс сеанса - завершается.

Процесс сеанса является первым процессом, запущенным в сеансе X11. Когда он уничтожен или завершается, сеанс завершается. Вы когда-нибудь видели этот xterm при запуске X без DE? Это процесс сеанса. Этот процесс называется kdeinitв KDE и gnome-sessionв GNOME.

После завершения сеанса управление возвращается вашему DM (который ждал завершения процесса X), и он проверяет, что DE сказал ему сделать. Если он сказал ему выключить или перезапустить, он сделает это. В другом случае он просто запустит новый экран входа в систему X.

Это также связано с проблемами, с которыми вы, возможно, сталкивались в прошлом, когда некоторые DE не могли выключить или перезапустить, просто выйти из системы при использовании в сочетании с некоторыми другими DM.

В любом случае, это не так плохо задокументировано. GDM имеет справочную страницу команды, которая позволяет вам отключить ее, как я говорил ранее ( gdm-control). KDM также имеет отличную документацию и имеет похожую (немного более сложную) утилиту kdmctl.


Выключение и перезагрузка возможны без PolicyKit, но PolicyKit служит многим целям, необходимым в современных системах, таких как монтирование дисков без рутирования, приостановки или спящего режима компьютера. И это ни плохо не задокументировано!

Проверьте это, если вы хотите узнать больше о том, что такое PolicyKit и как он работает: http://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

Алисия
источник
Звучит многообещающе. Спасибо за ссылки на документы. Я не сомневаюсь, что эти руководства являются исчерпывающими и понятными, но они могли бы и не существовать. Ваш ответ - первый раз, когда я увидел менеджер дисплеев, упомянутый в связи с этой проблемой, так что это не совсем общеизвестно. Я попробую это и дам вам знать ...
Джозеф Р.
OK. gdm-controlне было никакой помощи Документация, предоставленная вами в PolicyKit, выглядит более перспективной. Я углублюсь в это и посмотрю, смогу ли я реализовать собственное правило. Продолжение следует ...
Джозеф Р.
1
Я немного прочитал (скимминг, больше как) и, пожалуйста, поправьте меня, если я ошибаюсь: DE, когда его попросят отключить, отправит сообщение DM через polkit на D-BUS. В ожидании аутентификации сеанс может быть либо завершен, либо запрос отменен. Это определено в polkitдействии, которое называется org.freedesktop.consolekit.system.stop-multiple-usersIn. /usr/share/polkit-1/actionsОно настроено на отзыв запроса для неактивных пользователей и auth_admin_keepдля активного пользователя. Вопрос в том, что определяет это действие? Что именно он выполняет?
Джозеф Р.
@don_crissti Это то, что я теперь понимаю. Меня интересует именно этот «сигнал». Какой клиент отправляет его?
Джозеф Р.
@don_crissti Хотите переместить этот комментарий к моему другому вопросу для продолжения?
Джозеф Р.