Приостановка системы - сигналы повышающего напряжения dbus не видны
Я хочу получать уведомления через dbus, когда система возобновляет работу из приостановленного состояния. После этих существующих вопросов:
- Какой сигнал DBus отправляется в системный режим ожидания?
- Как я могу определить, когда моя система выходит из режима ожидания через DBus или подобное в приложении на Python?
Но ни один из примеров, найденных в ссылках выше, не срабатывает, когда я приостанавливаю или возобновляю.dbus-monitor тоже ничего не видит:
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 установлен, работает и работает нормально). Fedora 20 использует logind, но я не вижу там никакого сигнала "Возобновление". Приостановить и возобновить сложно с VirtualBox, поэтому я не могу сравнить его с другими операционными системами.
Интересно, что qdbus видит много сервисов (org.gnome.SessionManager и т. Д.), Но ничего не связано с питанием, но опять же, он также не видит login1..
qdbus | grep -i power | wc -l
0
2 ответа
Согласно этому ответу на тот же вопрос в списке рассылки 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_()