修改 systemd-logind

sudo nano /etc/systemd/logind.conf

修改下两行:

HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
sudo systemctl restart systemd-logind
  • 可能需要 ctrl+C,不然会一直卡住

安装 acpid

acpid (Advanced Configuration and Power Interface daemon) 可以监听 ACPI 事件,如合上盖子。

sudo apt install acpid

创建盖子合上事件的脚本:

sudo nano /etc/acpi/events/lid_close_screen_off

内容:

event=button/lid LID close
action=/etc/acpi/lid_close_screen_off.sh

创建屏幕关闭的动作脚本:

sudo nano /etc/acpi/lid_close_screen_off.sh

内容:

#!/bin/bash
logger "Lid close detected. Attempting to turn off display."

# 遍历所有活跃的图形会话
# loginctl list-sessions 列出所有会话
# grep "active" 过滤出活跃会话
# grep "graphical" 进一步过滤出图形会话
# awk '{print $1}' 提取会话ID
ACTIVE_SESSIONS=$(loginctl list-sessions | grep "active" | grep "graphical" | awk '{print $1}')

for SESSION_ID in $ACTIVE_SESSIONS; do
# 获取当前会话的用户、显示器和XAUTHORITY文件路径
USER=$(loginctl show-session "$SESSION_ID" -p User | cut -d'=' -f2)
DISPLAY_VAR=$(loginctl show-session "$SESSION_ID" -p Display | cut -d'=' -f2)
XAUTHORITY_VAR=$(loginctl show-session "$SESSION_ID" -p XAuthority | cut -d'=' -f2)

if [ -n "$USER" ] && [ -n "$DISPLAY_VAR" ] && [ -n "$XAUTHORITY_VAR" ]; then
logger "Found active graphical session for user $USER on display $DISPLAY_VAR with XAUTHORITY $XAUTHORITY_VAR"
# 以该用户的身份,使用其DISPLAY和XAUTHORITY变量执行 xset dpms force off 命令
# 'su - "$USER" -c "..."' 确保在正确的用户和环境中执行命令
su - "$USER" -c "export DISPLAY=$DISPLAY_VAR; export XAUTHORITY=$XAUTHORITY_VAR; /usr/bin/xset dpms force off"
if [ $? -eq 0 ]; then
logger "Successfully turned off display for user $USER on $DISPLAY_VAR."
exit 0 # 如果成功关闭一个显示器,则退出
else
logger "Failed to turn off display for user $USER on $DISPLAY_VAR."
fi
fi
done

logger "No graphical session found or could not turn off display."

赋予脚本执行权限:

sudo chmod +x /etc/acpi/lid_close_screen_off.sh

创建盖子打开事件的脚本(用于重新打开屏幕):

sudo nano /etc/acpi/events/lid_open_screen_on

内容:

event=button/lid LID open
action=/etc/acpi/lid_open_screen_on.sh

创建屏幕打开的动作脚本:

sudo nano /etc/acpi/lid_open_screen_on.sh

内容:

#!/bin/bash
logger "Lid open detected. Attempting to turn on display."

ACTIVE_SESSIONS=$(loginctl list-sessions | grep "active" | grep "graphical" | awk '{print $1}')

for SESSION_ID in $ACTIVE_SESSIONS; do
USER=$(loginctl show-session "$SESSION_ID" -p User | cut -d'=' -f2)
DISPLAY_VAR=$(loginctl show-session "$SESSION_ID" -p Display | cut -d'=' -f2)
XAUTHORITY_VAR=$(loginctl show-session "$SESSION_ID" -p XAuthority | cut -d'=' -f2)

if [ -n "$USER" ] && [ -n "$DISPLAY_VAR" ] && [ -n "$XAUTHORITY_VAR" ]; then
logger "Found active graphical session for user $USER on display $DISPLAY_VAR with XAUTHORITY $XAUTHORITY_VAR"
# xset dpms force on 开启显示器
# xset s reset 和 xset s noblank 确保屏幕保护程序不会立即重新触发
su - "$USER" -c "export DISPLAY=$DISPLAY_VAR; export XAUTHORITY=$XAUTHORITY_VAR; /usr/bin/xset dpms force on; /usr/bin/xset s reset; /usr/bin/xset s noblank"
if [ $? -eq 0 ]; then
logger "Successfully turned on display for user $USER on $DISPLAY_VAR."
exit 0
else
logger "Failed to turn on display for user $USER on $DISPLAY_VAR."
fi
fi
done

logger "No graphical session found or could not turn on display."

赋予脚本执行权限:

sudo chmod +x /etc/acpi/lid_open_screen_on.sh

启动/重启 acpid 服务:

sudo systemctl enable acpid
sudo systemctl restart acpid