KDE系统笔记本睡眠后立刻被唤醒问题

介绍

前段时间遇到了笔记本休眠后立刻启动的问题,导致我好几天只能将电脑关机,现在终于是定位到了问题。

这是我的系统详细信息:

  • 笔记本型号:ROG Zephyrus G16 GU603VV_GU603VV
  • 系统版本:openSUSE Leap 15.5
  • KDE Plasma版本:5.27.9

问题定位

问题的根源在于笔记本的自带事件,在/proc/acpi/wakeup中可以将无关事件禁用, 从而使电脑正常休眠。

通过以下命令可以手动禁用事件。

echo IGBE | sudo tee /proc/acpi/wakeup

参考文章中作者测试后发现是IGBEXHCI事件导致的电脑无法关机,我在自己的系统中测试后发现仅关闭XHCI即可使我的电脑正常休眠与睡眠。

问题解决

编写shell脚本,找个地方放,我放在了~/.task/下,用于保存系统命令相关脚本:

mkdir ~/task
vim ~/task/suspend_event.sh

随后放入以下脚本:

#!/bin/sh
# Some events will wakeup right after suspend, disable them
stat=$(cat /proc/acpi/wakeup)
wakers=(XHCI)
for waker in ${wakers[@]}; do
    is_en=$(echo "${stat}" | grep $waker | grep disabled);
    if  [ -z "$is_en" ]; then
        echo disable wakeup of $waker...
        echo $waker | tee /proc/acpi/wakeup;
    fi
done

编写完成后给脚本执行权限(我就是因为忘记给权限导致service无法启动):

chmod +x ~/task/suspend_event.sh

然后创建service,让每次启动时执行脚本:

sudo vim /etc/systemd/system/sleepable.service

将以下代码放入:

[Unit]
Description=disable some events to wake up device
After=systemd-udev-settle.service

[Service]
Type=idle
ExecStart=/opt/bin/for_systemd/suspend_event.sh
RemainAfterExit=no

[Install]
WantedBy=multi-user.target

[!IMPORTANT] 必须要加上 After=systemd-udev-settle.service,否则service不生效。

最后将服务设置为开机自启:

systemctl enable sleepable

参考资料: