System suspend – dbus upower signals are not seen

dbussuspendsystemd

I want to get notifications via dbus when the system resumes from suspended state.
Following these existing questions:

  1. What DBus signal is sent on system suspend?
  2. How do I detect when my system wakes up from suspend via DBus or similar in a python app?

But none of the examples found in the links above fire when I suspend or resume.
dbus-monitor does not see anything either:

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

I also tried using this code to fire the signal manually (easier):

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

Same result. I must be missing something really obvious.
Fedora 20 x86_64. (dbus is installed, running and working fine AFAICT)
Fedora 20 uses logind, but I cannot see any 'Resuming' signal there.
Suspend and resume is difficult to test with VirtualBox, so I can't really compare with other OSes.

Interestingly, qdbus sees lots of services (org.gnome.SessionManager, etc..) , but nothing power related, but then again, it doesn't see login1 either..

qdbus | grep -i power | wc -l
0

Best Answer

According to this answer to the same question on the devkit mailing list used by upower, newer versions no longer emit that signal since this handled by systemd.

The replacement in systemd-land is logind, which has a signal called PrepareForSleep: "The PrepareForShutdown() resp. PrepareForSleep() signals are sent right before (with the argument True) and after (with the argument False) the system goes down for reboot/poweroff, resp. suspend/hibernate."

Here is a simple python script for watching suspend / resume events:

#!/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()
Related Topic