解决 Linux 休眠后自动重启的问题
最近机器不知道咋了,一休眠就会自动重启,明明看着已经休眠关机了,几秒钟后竟然又自己开了,非常耽误事。
跟这个老哥的状况几乎一模一样,解决方法也差不多,查看/proc/acpi/wakeup
这个文件,它列出了系统中哪些设备可以唤醒计算机从睡眠状态中恢复。
cat /proc/acpi/wakeup # 查看系统电源管理状态
以下是我的电源状态:
Device S-state Status Sysfs node
PEG1 S4 *disabled
PEGP S4 *disabled
PEG2 S4 *disabled
PEGP S4 *disabled
PEG3 S4 *disabled
PEGP S4 *disabled
PEG0 S4 *enabled pci:0000:00:06.0
PEGP S4 *disabled pci:0000:01:00.0
RP01 S4 *disabled
PXSX S4 *disabled
RP02 S4 *disabled
PXSX S4 *disabled
RP03 S4 *disabled
PXSX S4 *disabled
RP04 S4 *disabled
PXSX S4 *disabled
RP05 S4 *enabled pci:0000:00:1c.0
PXSX S4 *disabled pci:0000:2d:00.0
RP06 S4 *disabled
PXSX S4 *disabled
RP07 S4 *disabled
PXSX S4 *disabled
RP08 S4 *disabled
PXSX S4 *disabled
RP09 S4 *enabled pci:0000:00:1d.0
PXSX S4 *disabled pci:0000:2e:00.0
PEGA S4 *disabled
RP10 S4 *disabled
PXSX S4 *disabled
RP11 S4 *disabled
PXSX S4 *disabled
RP12 S4 *disabled
PXSX S4 *disabled
RP13 S4 *disabled
PXSX S4 *disabled
RP14 S4 *disabled
PXSX S4 *disabled
RP15 S4 *disabled
PXSX S4 *disabled
RP16 S4 *disabled
PXSX S4 *disabled
RP17 S4 *disabled
PXSX S4 *disabled
RP18 S4 *disabled
PXSX S4 *disabled
RP19 S4 *disabled
PXSX S4 *disabled
RP20 S4 *disabled
PXSX S4 *disabled
RP21 S4 *disabled
PXSX S4 *disabled
RP22 S4 *disabled
PXSX S4 *disabled
RP23 S4 *disabled
PXSX S4 *disabled
RP24 S4 *disabled
PXSX S4 *disabled
XHCI S4 *enabled pci:0000:00:14.0
XDCI S4 *disabled
HDAS S4 *disabled pci:0000:00:1f.3
CNVW S4 *disabled pci:0000:00:14.3
TXHC S4 *enabled pci:0000:00:0d.0
TDM0 S4 *enabled pci:0000:00:0d.2
TDM1 S4 *disabled
TRP0 S4 *enabled pci:0000:00:07.0
PXSX S4 *disabled
TRP1 S4 *disabled
PXSX S4 *disabled
TRP2 S4 *disabled
PXSX S4 *disabled
TRP3 S4 *disabled
PXSX S4 *disabled
AWAC S4 *enabled platform:ACPI000E:00
- 第一列是设备名称。
- 第二列是设备的S状态,表示设备在系统的电源管理中处于何种状态。
- 第三列是设备的启用/禁用状态。
- 第四列是设备的Sysfs节点。
其中,S-state
的状态为S4
是 ACPI 中定义的系统休眠状态之一,也称为挂起到磁盘(Suspend-to-Disk)模式。在该模式下,计算机会将当前的内存状态保存到硬盘上并关闭所有设备,直到再次唤醒。
这也就是我使用的hibernate
休眠。
禁用唤醒
既然当前启用的全部都是有关S4
的,那就索性全部关掉好了:
sudo sh -c 'grep enabled /proc/acpi/wakeup | cut -f 1 -d " " | xargs -I {} sh -c "echo {} > /proc/acpi/wakeup"' # 禁用所有唤醒
以上命令执行完后,再测试下休眠:
sudo systemctl hibernate
会发现虽然正常了,但没过多久,以上设置就又会被改回来。
脚本动作
/usr/lib/systemd/system-sleep
这个目录可以创建自定义的脚本,在系统进入休眠或唤醒状态时执行特定的操作。
当系统进入休眠状态(suspend、hibernate 或 hybrid-sleep)之前,systemd 会按照字母顺序运行该目录中以 .sh
结尾的可执行文件。同样,在系统从休眠状态唤醒之后,systemd 也会运行这些脚本。
这些脚本可以执行一些必要的操作,例如保存和恢复设备状态、配置特定的设置等。
脚本接收两个参数:第一个参数表示操作类型("pre" 表示休眠前操作,"post" 表示休眠后操作),第二个参数表示休眠状态("suspend"、"hibernate" 或 "hybrid-sleep")。
所以写一个自动化脚本:
sudo nano /usr/lib/systemd/system-sleep/disable_automatic_wake-up
脚本内容:
#!/bin/sh
# /usr/lib/systemd/system-sleep
case $1 in
pre)
sh -c 'grep enabled /proc/acpi/wakeup | cut -f 1 -d " " | xargs -I {} sh -c "echo {} > /proc/acpi/wakeup"' # 禁用所有唤醒
;;
*)
;;
esac
每次在执行休眠之前,系统会先执行以上脚本,禁用掉所有唤醒动作,之后再休眠。
就不会再被唤醒了。