Назад | Перейти на главную страницу

приостановка системы - сигналы dbus upower не видны

Я хочу получать уведомления через dbus, когда система выходит из приостановленного состояния. Следуя этим существующим вопросам:

  1. Какой сигнал DBus отправляется при приостановке системы?
  2. Как я могу определить, когда моя система выходит из режима ожидания через DBus или что-то подобное в приложении на Python?

Но ни один из примеров, найденных в приведенных выше ссылках, не срабатывает, когда я приостанавливаю или возобновляю работу. dbus-монитор тоже ничего не видит:

 dbus-monitor --system "type='signal',interface='org.freedesktop.UPower'"

Я также пробовал использовать этот код, чтобы запустить сигнал вручную (проще):

#taken from /usr/lib/systemd/system/upower.service
dbus-send --system --type=signal --dest=org.freedesktop.UPower \
    /org/freedesktop/UPower org.freedesktop.UPower.Resuming

Тот же результат. Должно быть, я упускаю что-то действительно очевидное. Fedora 20 x86_64. (dbus установлен, работает и работает нормально AFAICT) Fedora 20 использует logind, но я не вижу там сигнала "Возобновление". Приостановку и возобновление работы сложно протестировать с помощью VirtualBox, поэтому я не могу сравнивать с другими ОС.

Интересно, что qdbus видит множество сервисов (org.gnome.SessionManager и т. Д.), Но ничего не связанного с питанием, но опять же, он также не видит login1 ..

qdbus | grep -i power | wc -l
0

В соответствии с этот ответ на тот же вопрос в списке рассылки devkit, используемом Upower, более новые версии больше не испускать этот сигнал, так как это обрабатывается systemd.

Замена в systemd-land есть logind, который имеет сигнал, называемый PrepareForSleep: «Сигналы PrepareForShutdown () или PrepareForSleep () отправляются непосредственно перед (с аргументом True) и после (с аргументом False), когда система отключается для перезагрузки / отключения питания или приостановки / гибернации».

Вот простой скрипт на Python для просмотра событий приостановки / возобновления:

#!/usr/bin/env python

from datetime import datetime
import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop

def handle_sleep(*args):
    print "%s    PrepareForSleep%s" % (datetime.now().ctime(), args)

DBusGMainLoop(set_as_default=True)     # integrate into gobject main loop
bus = dbus.SystemBus()                 # connect to system wide dbus
bus.add_signal_receiver(               # define the signal to listen to
    handle_sleep,                      # callback function
    'PrepareForSleep',                 # signal name
    'org.freedesktop.login1.Manager',  # interface
    'org.freedesktop.login1'           # bus name
)

loop = gobject.MainLoop()
loop.run()

Приведенный выше ответ мне очень помог! Но если кому-то нужна версия Qt ...

#!/usr/bin/env python3

from datetime import datetime
import sys, dbus
from PyQt4.QtGui import QApplication
from dbus.mainloop.qt import DBusQtMainLoop

class DBusListener():

  def handle_sleep(self, suspended):
    print(datetime.now().ctime()," Suspended? ", str(suspended))

  def __init__(self):
    DBusQtMainLoop(set_as_default=True)    # integrate into Qt main loop
    bus = dbus.SystemBus()                 # connect to system wide dbus
    bus.add_signal_receiver(               # define the signal to listen to
      self.handle_sleep,                   # callback function
      'PrepareForSleep',                   # signal name
      'org.freedesktop.login1.Manager',    # interface
      'org.freedesktop.login1'             # bus name
    )

app = QApplication(sys.argv)
DBusListener()
app.exec_()