Systemd

系統掛起 - 看不到 dbus upower 信號

  • September 30, 2015

當系統從掛起狀態恢復時,我想通過 dbus 獲得通知。在這些現有問題之後:

  1. 系統掛起時發送什麼 DBus 信號?
  2. 如何檢測我的系統何時通過 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 已安裝、執行和工作正常 AFAICT)Fedora 20 使用logind,但我在那裡看不到任何“恢復”信號。掛起和恢復很難用 VirtualBox 測試,所以我無法與其他作業系統進行比較。

有趣的是,qdbus 看到了很多服務(org.gnome.SessionManager 等),但與電源無關,但話又說回來,它也沒有看到 login1..

qdbus | grep -i power | wc -l
0

根據upower 使用的devkit郵件列表上對同一問題的回答,較新的版本不再發出該信號,因為這是由 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()

引用自:https://serverfault.com/questions/573379