必须同时禁用systemd睡眠目标、修改logind.conf中handlelidswitch和idleaction为ignore、配置sleep.conf禁止挂起,三者缺一不可;仅mask suspend.target无效,因logind会绕过target直接触发睡眠。

直接结论:只改图形界面设置没用,必须同时禁用 systemd 的睡眠目标 + 修改 logind.conf + 配置 sleep.conf,三者缺一不可。
systemctl mask 会失效?别只靠它
很多人执行 sudo systemctl mask suspend.target 后发现系统还是挂起——这不是命令错了,而是 systemd-logind 服务在用户空闲时会绕过这些 target,直接调用底层 sleep 逻辑。mask 只能阻止手动触发(如点击菜单或运行 systemctl suspend),对自动空闲挂起无效。
- mask 适合防误操作,但不是自动挂起的开关
- Ubuntu/Debian 系统中,
logind.conf的IdleAction和HandleLidSwitch才是真正控制“不动就睡”的开关 - 如果只 mask 不改 logind.conf,合盖、空闲超时仍会触发挂起
/etc/systemd/logind.conf 必须改这四行
编辑 /etc/systemd/logind.conf,取消注释并设为 ignore:
[Login] HandleSuspendKey=ignore HandleHibernateKey=ignore HandleLidSwitch=ignore IdleAction=ignore
注意:IdleAction=ignore 是关键,它让系统无视空闲计时器;而 HandleLidSwitch=ignore 对笔记本用户尤其重要——否则合盖必挂起,哪怕你已经关了电源设置。
- 改完必须重启服务:
sudo systemctl restart systemd-logind - 不重启,配置不生效;重启后无需重登录,但建议登出再进一次
- 某些桌面环境(如 GNOME)还会叠加自己的空闲策略,所以这步只是基础,不是终点
/etc/systemd/sleep.conf 或 .conf.d/ 文件才是最终防线
systemd 从 /etc/systemd/sleep.conf 或 /etc/systemd/sleep.conf.d/*.conf 读取全局睡眠许可。仅靠 logind.conf 还不能彻底隐藏“挂起”菜单项,也不能阻止某些服务(如 UPower)尝试调用 systemd-suspend.service。
- 推荐做法:创建
/etc/systemd/sleep.conf.d/disable-sleep.conf,内容为:
[Sleep] AllowSuspend=no AllowHibernation=no AllowSuspendThenHibernate=no AllowHybridSleep=no
- 这个文件比直接改
/etc/systemd/sleep.conf更安全,升级时不会被覆盖 - 改完无需重启服务,但右上角关机菜单里的“挂起”选项会立即消失
- 若用的是老版本 systemd(AllowSuspendThenHibernate 可能不识别,可忽略
容易被忽略的三个点
即使上面全做了,仍可能挂起:
- GNOME 桌面下,
gsettings set org.gnome.desktop.session idle-delay 0必须执行,否则 GNOME 自己计时强制锁屏+挂起 - 某些厂商 BIOS/UEFI 有“Modern Standby”(即 S0ix)模式,Linux 无法完全控制,需进 BIOS 关掉 “Fast Boot” 或启用 “Legacy Sleep”
- 如果用了
systemd-suspend-then-hibernate.timer(常见于 Ubuntu Server),要额外运行sudo systemctl disable systemd-suspend-then-hibernate.timer











