system suspend - os sinais dbus upower não são vistos

3

Eu quero receber notificações via dbus quando o sistema sair do estado suspenso. Seguindo estas perguntas existentes:

  1. Qual sinal do DBus é enviado no sistema suspenso?
  2. Como faço para detectar quando meu sistema acorda da suspensão via DBus ou similar em um aplicativo python?

Mas nenhum dos exemplos encontrados nos links acima é acionado quando suspenso ou retomado. dbus-monitor também não vê nada:

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

Eu também tentei usar este código para disparar o sinal manualmente (mais fácil):

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

O mesmo resultado. Eu devo estar perdendo algo realmente óbvio. Fedora 20 x86_64. (dbus está instalado, funcionando e funcionando bem AFAICT) O Fedora 20 usa logind , mas não consigo ver nenhum sinal de 'Resuming'. Suspender e retomar é difícil de testar com o VirtualBox, então eu não posso realmente comparar com outros sistemas operacionais.

Curiosamente, o qdbus vê muitos serviços (org.gnome.SessionManager, etc.), mas nada relacionado com o poder, mas, novamente, também não vê login1.

qdbus | grep -i power | wc -l
0
    
por totaam 05.02.2014 / 15:51

2 respostas

2

De acordo com esta resposta para a mesma pergunta na lista de discussão devkit usado por upower , versões mais recentes não emitem mais esse sinal, já que isso é controlado pelo systemd .

A substituição no systemd-land é logind , que tem um sinal chamado PrepareForSleep : "Os sinais PrepareForShutdown () e PrepareForSleep () são enviados diretamente antes (com o argumento True) e depois (com o argumento False) o sistema desce para reboot / poweroff, ou suspensão / hibernação."

Aqui está um script python simples para assistir a eventos de suspensão / retomada:

#!/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()
    
por 16.03.2014 / 16:17
0

A resposta acima me ajudou muito! Mas no caso de alguém precisar de uma versão do 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_()
    
por 30.09.2015 / 14:15