Я уже давно бьюсь головой об этом. Это связано с этим вопросом . Я хотел бы выяснить, что именно происходит, когда я решаю закрыть окно Linux из графического интерфейса. Это, кажется, плохо (если вообще) задокументировано.
В идеале я надеюсь на независимый от DE и OS ответ. За исключением этого, меня интересует конкретный случай Mandriva 2010.1 и Debian 6.x (Squeeze) и 7.0 (Wheezy), на которых работает Gnome. (Если вы уделяете пристальное внимание, да, это Гном 2 и Гном 3)
В основном, я хотел бы знать, какая команда / скрипт / последовательность скриптов запускается, когда я нажимаю «Завершение работы» или «Перезапуск», чтобы я мог изменить их поведение. Некоторые сообщения на форуме, на которые я смотрел, предлагают взломать, /etc/polkit-1/*
но эта структура каталогов, к примеру, является всего лишь каркасом в моем окне Debian (Squeeze).
Кто-нибудь может помочь?
РЕДАКТИРОВАТЬ
Что я пробовал до сих пор
- Заменил
shutdown
исполняемый файл на мой собственный скрипт. Это не работает: когда я нажимаюshutdown
Gnome выходит из системы без выполнения моего сценария. - Пробовал редактировать меню 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
для вызова скрипта при остановке .Ответы:
Это зависит от вашего диспетчера отображения! (т.е. 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
источник
gdm-control
не было никакой помощи Документация, предоставленная вами в PolicyKit, выглядит более перспективной. Я углублюсь в это и посмотрю, смогу ли я реализовать собственное правило. Продолжение следует ...polkit
действии, которое называетсяorg.freedesktop.consolekit.system.stop-multiple-users
In./usr/share/polkit-1/actions
Оно настроено на отзыв запроса для неактивных пользователей иauth_admin_keep
для активного пользователя. Вопрос в том, что определяет это действие? Что именно он выполняет?