通过/etc/rc.local运行脚本时如何通过dbus获取系统空闲时间?
问题根源
/etc/rc.local 是系统全局启动项,执行时机远早于用户图形会话初始化流程,既没有对应登录用户的DBus会话环境变量,也无法访问尚未启动的GNOME Mutter服务,同时你原脚本的死循环没有设置休眠间隔,会阻塞后续系统启动流程,最终导致卡登录界面和DBus报错,仅配置DISPLAY=:0无法覆盖缺失的运行环境要求。
修复步骤
1. 优化空闲检测脚本
修改/home/paulky/shutdown.sh内容如下,补充环境变量配置和休眠逻辑,避免资源浪费:
#!/bin/bash # 等待30秒确保图形会话完全初始化 sleep 30 # 配置当前用户的DBus会话地址和DISPLAY变量 export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u paulky)/bus" export DISPLAY=:0 while true; do # 每1分钟检测一次空闲时间,降低CPU占用 sleep 60 get_idle_time=$(dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime) idle_time=$(echo "$get_idle_time" | awk '{print $NF}') # 空闲超过1小时执行关机 if [[ $idle_time -ge 3600000 ]]; then systemctl poweroff fi done
给脚本添加执行权限:
chmod +x /home/paulky/shutdown.sh
如果需要关机时不需要输入密码,执行sudo visudo编辑sudo配置,在文件末尾添加以下内容后保存:
paulky ALL=(ALL) NOPASSWD: /usr/bin/systemctl poweroff
2. 替换启动方式(废弃rc.local配置)
rc.local的执行时机不适合运行依赖图形会话的脚本,改用GNOME用户级自启即可:
- 安装GNOME优化工具(已安装可跳过):
sudo apt install gnome-tweaks - 打开优化工具,进入「开机启动程序」页面
- 点击添加按钮,名称自定义为「空闲自动关机」,命令填写
bash /home/paulky/shutdown.sh,保存配置即可
可选替代方案(支持登录前空闲检测)
如果需要在用户未登录的状态下也能检测空闲自动关机,可以更换检测工具为xprintidle:
- 安装工具:
sudo apt install xprintidle - 修改脚本中的空闲时间获取逻辑为:
idle_time=$(xprintidle)
- 启动方式改为配置LightDM/GDM的自启脚本,将脚本执行命令写入
/etc/gdm3/PostLogin/Default文件即可。
内容的提问来源于stack exchange,提问作者Paulky
相关产品推荐
相关产品推荐

