解决 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

每次在执行休眠之前,系统会先执行以上脚本,禁用掉所有唤醒动作,之后再休眠。

就不会再被唤醒了。

Comments

添加新评论

注意:评论会以邮件形式发送给我

Comment Atom Feed