介紹
前段時間遇到了筆記本休眠後立刻啓動的問題,導致我好幾天只能將電腦關機,現在終於是定位到了問題。
這是我的系統詳細信息:
- 筆記本型號:ROG Zephyrus G16 GU603VV_GU603VV
- 系統版本:openSUSE Leap 15.5
- KDE Plasma版本:5.27.9
問題定位
問題的根源在於筆記本的自帶事件,在/proc/acpi/wakeup中可以將無關事件禁用, 從而使電腦正常休眠。
通過以下命令可以手動禁用事件。
echo IGBE | sudo tee /proc/acpi/wakeup
參考文章中作者測試後發現是IGBE和XHCI事件導致的電腦無法關機,我在自己的系統中測試後發現僅關閉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
必須要加上 After=systemd-udev-settle.service,否則service不生效。
最後將服務設置為開機自啓:
systemctl enable sleepable
參考資料:
- 問題定位
- service編寫
- ChatGPT