Как служба сеанса Python DBus узнает, что пользователь вышел из системы?
Допустим, у вас есть служба DBus на шине сеанса (шина для каждого пользователя). Ваш сервис может быть запущен через /etc/xdg/autostart/* файл, или он может запуститься в первый раз, когда какое-либо приложение пытается использовать ваше известное имя службы. В любом случае, допустим, что сессионная шина DBus - это процесс, который запускает ваш сервис.
И тогда пользователь выходит из системы. Так что же происходит? Посылает ли DBus какие-либо действенные сигналы SIGSIGKILL? Есть ли другой способ узнать, что пользователь выходит из системы? По сути, у меня есть некоторые действия по очистке, которые мне нужно выполнить, в том числе уничтожение подпроцессов, запущенных с subprocess.Popen а также multiprocessing,
Теперь вы, прежде чем сказать, "Popen а также multiprocessing злые, не используйте их ", в моем текущем эксперименте я их не использую. Я просто пытаюсь выяснить, как служба Python DBus может подключиться к чему-то, что позволяет ей выполнять действия по очистке, независимо от того, архитектура может быть.
Любой совет? Есть примеры? Обратите внимание, что мой пример будет запущен в GObject.MainLoop и использует Python3 на Ubuntu Precise (или Quantal).
2 ответа
Вы можете сделать что-то вроде этого:
bus = dbus.SessionBus()
bus.call_on_disconnection(your_method_to_do_stuff)
Или вы можете подключиться к NameLost сигнал на org.FreeDesktop.DBus интерфейс. Первый не позволяет передавать дополнительные аргументы, а ваш метод может принимать только объект соединения с шиной в качестве аргумента. Последнее немного сложнее, но, похоже, также не позволяет передавать другие аргументы по вашему собственному усмотрению, и вы ограничены принятием аргументов, которые посылает сам сигнал, который в данном случае является строкой шины сообщений. Назовите свой процесс, ранее принадлежавший.
С другой стороны, если ваш процесс останется без изменений, теоретически вы должны получить SIGKILL в какой-то момент.
Если вам нужно работать только под GNOME & Unity, вы сможете подключиться к интерфейсу DBus диспетчера сеансов. Это не только дает вам сообщение "о выходе" через QueryEndSession а также EndSession сигналы, но также позволяет блокировать выход из системы / выключение, пока вы не закончите очистку, если хотите, через EndSessionResponse,
Я не уверен, в какой степени KDE реализует совместимый интерфейс.