You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux系统中检测睡眠/唤醒等全局系统事件?

检测Linux系统睡眠/唤醒事件的非root方案

下面是几个无需root权限就能实现的方案,适合在用户态项目中监听并响应系统睡眠、唤醒事件:

1. 通过DBus监听logind信号

大多数现代Linux发行版用systemd的logind管理电源事件,普通用户可以通过DBus订阅org.freedesktop.login1.Manager接口的PrepareForSleep信号。这个信号会在系统即将进入睡眠(参数为true)和刚唤醒(参数为false)时触发。

举个Python实现的简单例子:

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gi
gi.require_version('GLib', '2.0')
from gi.repository import GLib

def handle_sleep_event(is_preparing_for_sleep):
    if is_preparing_for_sleep:
        print("系统即将进入睡眠状态")
        # 这里添加你的响应逻辑
    else:
        print("系统已唤醒")
        # 这里添加你的响应逻辑

DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
bus.add_signal_receiver(
    handle_sleep_event,
    signal_name="PrepareForSleep",
    dbus_interface="org.freedesktop.login1.Manager",
    path="/org/freedesktop/login1"
)

loop = GLib.MainLoop()
loop.run()

2. 监听udev电源事件

udev会在系统电源状态变化时触发相关事件,普通用户可以通过libudev库(或封装它的语言库,比如Python的pyudev)监听这些事件。

你可以先用udevadm monitor --environment命令查看具体的事件内容,再针对性编写监听逻辑——比如监听power_supply类设备的状态变化,或是systemd-sleep相关的触发事件。

3. 桌面环境专属API(针对特定场景)

如果你的项目是针对GNOME、KDE等特定桌面环境开发,它们各自提供了电源管理相关的DBus接口:

  • GNOME可使用org.gnome.SessionManager接口
  • KDE可使用org.kde.Solid.PowerManagement接口
    这些接口都允许普通用户订阅睡眠/唤醒事件,无需root权限。

注:DBus+logind的方案兼容性最广,在绝大多数基于systemd的发行版上都能稳定运行。

内容的提问来源于stack exchange,提问作者Vipul Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:45:02