6

In a background Python script I need to detect, when the system just woke up from suspend. What is a good way that does not rely on a root script but rather on python modules such as DBus?

I'm new to dbus so I could really use some example code. From what I read it's related to

org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.Resuming

Can anyone help me out with some code that connects the resuming signal to callback?

2 Answers 2

9

Here is some example code that answers my question:

#!/usr/bin/python
# This is some example code on howto use dbus to detect when the system returns
#+from hibernation or suspend.

import dbus      # for dbus communication (obviously)
import gobject   # main loop
from dbus.mainloop.glib import DBusGMainLoop # integration into the main loop

def handle_resume_callback():
    print "System just resumed from hibernate or suspend"

DBusGMainLoop(set_as_default=True) # integrate into main loob
bus = dbus.SystemBus()             # connect to dbus system wide
bus.add_signal_receiver(           # defince the signal to listen to
    handle_resume_callback,            # name of callback function
    'Resuming',                        # singal name
    'org.freedesktop.UPower',          # interface
    'org.freedesktop.UPower'           # bus name
)

loop = gobject.MainLoop()          # define mainloop
loop.run()                         # run main loop

See the dbus-python tutorial.

1
  • This does not seem to work anymore. Also, I could not find that signal in the UPower API Docs. Seems like the next answer points in the right direction: The signals are now provided by org.freedesktop.login1.Manager.
    – Bluehorn
    Aug 21, 2019 at 7:20
7

The login1 interface provides the signal now. Here is the modified code:

#!/usr/bin/python
# slightly different code for handling suspend resume
# using login1 interface signals
#
import dbus      # for dbus communication (obviously)
import gobject   # main loop
from dbus.mainloop.glib import DBusGMainLoop # integration into the main loop

def handle_sleep_callback(sleeping):
  if sleeping:
    print "System going to hibernate or sleep"
  else:
    print "System just resumed from hibernate or suspend"

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

loop = gobject.MainLoop()          # define mainloop
loop.run()                         # run main loop
1
  • works fine. I noted that it seems unnecessary to run the gobject.MainLoop() if you're running a Gtk main loop.
    – bluppfisk
    Jan 5, 2018 at 9:55

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .