系统暂停 - 未看到 dbus upower 信号

系统暂停 - 未看到 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 已安装,运行良好,据我所知)Fedora 20 使用登录,但我看不到任何“恢复”信号。使用 VirtualBox 很难测试暂停和恢复,所以我无法与其他操作系统进行比较。

有趣的是,qdbus 看到很多服务(org.gnome.SessionManager 等),但没有与电源相关的服务,但同样,它也没有看到 login1。

qdbus | grep -i power | wc -l
0

答案1

根据这个答案回答 devkit 邮件列表中的同一个问题优力、较新版本不再发出该信号,因为这由 systemd 处理

systemd-land 中的替代方案是登录,其中有一个信号称为准备睡觉“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()

答案2

上面的答案对我帮助很大!但如果有人需要 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_()

相关内容