前置排查结论:
xset q DPMS参数全0、GNOME电源空闲超时=0、logind空闲策略注释关闭、无xautolock/swayidle/light-locker、cron无熄屏任务;熄屏程序不调用xset命令,直接通过X11底层API下发DPMS指令,常规配置无法捕获源头。
优先执行【现象验证测试】
新开终端运行常驻防御循环:
while true; do xset -dpms; xset s off; sleep 3; done
等待观察30秒,区分两种结果:
不再黑屏
结论:存在用户态X11客户端程序持续发送DPMS Off请求,循环持续重置DPMS状态抵消熄屏指令。
重点嫌疑人:cloakbrowser / Playwright Chromium 浏览器自动化套件(当前主机大量浏览器renderer进程)依然黑屏
排除X11 DPMS应用层通路,仅剩两类硬核原因:
- 场景A:KVM虚拟机/云工作站/VNC远程桌面,宿主机虚拟化层强制30s切断视频信号(虚拟机内部所有系统配置完全无效,高频踩坑点)
- 场景B:显卡驱动BUG、EDID异常,GPU硬件层面主动停止画面输出
需要确认的2个关键现象(定位根本方向)
- 当前Debian:物理机直连显示器,还是 KVM虚拟机/云主机/VNC/RDP远程桌面?
- 黑屏时显示器状态:
- 仅背光熄灭,显示器指示灯正常接收信号
- 显示器弹出OSD提示【无信号 No Signal】
追加排查命令(浏览器自动化方向)
检查Chromium/Cloakbrowser启动参数,搜寻节能相关标识
ps aux | grep chrome
重点留意参数:--screensaver、idle、power-save、display-suspend
临时业务兜底方案(优先保障业务,暂缓溯源)
后台常驻防熄屏进程,持久抑制DPMS熄屏
# 后台启动
nohup bash -c 'while true; do xset -dpms; xset s off; sleep 3; done' > /dev/null 2>&1 &
# 后续关闭进程
pkill -f "while true; do xset -dpms"
补充背景知识点
Playwright、二次定制打包Chromium(cloakbrowser)存在冷门特性:
页面长时间无交互时,部分修改版浏览器内置底层显示节能逻辑,直接调用X11协议发送熄屏指令;不会修改系统全局DPMS超时,无法通过xset、gsettings捕捉配置异常。
方案:systemd 服务管理 持续禁用DPMS防熄屏
注意:X11会话服务必须指定DISPLAY环境变量,否则xset无法连接X Server,不生效!
1. 创建服务文件
sudo nano /etc/systemd/system/dpms-keep-active.service
[Unit]
Description=Keep X11 DPMS Disabled, Prevent Monitor Auto Off
After=graphical-session.target
[Service]
Type=simple
# 修改为你的登录用户
User=guan
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/guan/.Xauthority"
ExecStart=/bin/bash -c 'while true; do xset -dpms; xset s off; sleep 3; done'
Restart=always
RestartSec=5
[Install]
WantedBy=graphical-session.target
⚠️ 重要说明:
DISPLAY=:0绝大多数本地GNOME X11默认值;如果你的环境不是:0,执行echo $DISPLAY获取真实值替换XAUTHORITY路径确保正确,没有这个权限不足,xset执行无效
2. 重载systemd、启用开机自启
sudo systemctl daemon-reload
# 开机自启
sudo systemctl enable dpms-keep-active.service
# 立即启动
sudo systemctl start dpms-keep-active.service
3. 常用管理命令
# 查看状态
systemctl status dpms-keep-active.service
# 停止服务
sudo systemctl stop dpms-keep-active.service
# 重启服务
sudo systemctl restart dpms-keep-active.service
# 取消开机自启
sudo systemctl disable dpms-keep-active.service
4. 故障排查(服务运行但不生效时)
# 查看日志
journalctl -u dpms-keep-active.service -f
常见报错:
-
Can't open display :0→ DISPLAY变量不对 / XAuthority路径错误
5. 一键部署脚本(可选,直接复制运行自动创建服务)
新建 install-dpms-guard.sh
#!/bin/bash
SERVICE_PATH="/etc/systemd/system/dpms-keep-active.service"
cat > $SERVICE_PATH << EOF
[Unit]
Description=Keep X11 DPMS Disabled, Prevent Monitor Auto Off
After=graphical-session.target
[Service]
Type=simple
User=guan
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/guan/.Xauthority"
ExecStart=/bin/bash -c 'while true; do xset -dpms; xset s off; sleep 3; done'
Restart=always
RestartSec=5
[Install]
WantedBy=graphical-session.target
EOF
systemctl daemon-reload
systemctl enable dpms-keep-active.service
systemctl start dpms-keep-active.service
echo "============================================="
echo "服务安装完成!"
echo "查看状态: systemctl status dpms-keep-active.service"
echo "停止: sudo systemctl stop dpms-keep-active.service"
echo "============================================="
赋予权限执行:
chmod +x install-dpms-guard.sh
sudo ./install-dpms-guard.sh
补充限制提醒
- 仅对X11环境有效,Wayland环境xset完全失效;
- 如果根源是【宿主机/KVM虚拟化层强制切断信号】,此服务只能缓解,无法彻底解决;
- 若多显示器/多DISPLAY,需要多实例运行;
- 用户注销重登X会话时,服务会自动重启恢复规则。
卸载方式
sudo systemctl stop dpms-keep-active.service
sudo systemctl disable dpms-keep-active.service
sudo rm /etc/systemd/system/dpms-keep-active.service
sudo systemctl daemon-reload