要修改空闲后自动挂起时间,需编辑 /etc/systemd/logind.conf 中的 IdleAction=suspend、IdleActionSec=300(单位秒)和 IdleActionMode=any,然后执行 sudo systemctl restart systemd-logind 生效;注意桌面环境设置、systemd-inhibit 进程及电源模式可能覆盖该配置。

systemd 的挂起(suspend)触发条件由电源管理策略控制,不是靠“定时脚本”或“用户级轮询”实现的,而是由 logind.conf 和 UPower 服务协同决定。Ubuntu 默认只响应空闲超时,不支持“CPU 负载低 + 空闲 > X 分钟”这类复合条件。
怎么改空闲后自动挂起的时间?
核心配置文件是 /etc/systemd/logind.conf,它控制图形会话和终端会话的挂起行为:
-
IdleAction=suspend:启用空闲挂起(默认是lock,不是suspend) -
IdleActionSec=300:空闲多少秒后执行(例如300表示 5 分钟) -
IdleActionMode=any或all:决定是否所有 session 都空闲才算(any更常用)
修改后必须重启 systemd-logind 才生效:
sudo systemctl restart systemd-logind
注意:IdleActionSec 只在系统无键盘/鼠标输入、无音频播放、无屏幕活动时计时;播放视频、SSH 连接活跃、或有 systemd-inhibit 进程运行时,计时会暂停。
为什么设置了 IdleActionSec 却不挂起?
常见原因有三个,按优先级排查:
- 桌面环境覆盖了
logind.conf:GNOME/KDE 有自己的电源设置(如 GNOME 的gsettings set org.gnome.settings-daemon.plugins.power sleep-inactive-ac-timeout),会屏蔽logind的配置 -
systemd-inhibit正在运行:某些应用(如 VLC、Chrome 播放网页视频、rsync大文件传输)会调用org.freedesktop.login1.Inhibit接口阻止挂起,可用loginctl inhibit-list查看当前抑制项 - AC 供电 vs 电池模式未区分:
logind.conf中的IdleActionSec是全局值,但 GNOME 设置里可分别设「接电时」和「使用电池时」的挂起时间,后者优先级更高
能否让挂起只在特定条件下触发?比如“仅电池供电 + 空闲 10 分钟”?
不能直接通过 logind.conf 实现,但可以绕过它,用 systemd 服务监听电源状态变化:
- 用
upower监听OnBattery属性变化(dbus-monitor --system "interface='org.freedesktop.UPower',member='PropertiesChanged'") - 写一个轻量脚本,当检测到切换为电池供电时,启动一个
systemd.timer,10 分钟后执行systemctl suspend - 该 timer 必须设为
StopWhenUnneeded=yes,并在 AC 插入时由另一个 service 取消它
这种方案有效,但复杂度陡增;多数用户真正需要的只是统一空闲阈值,而非条件组合 —— 因为 Linux 内核和 systemd 并不提供“CPU 使用率 N 分钟”的原生判断逻辑。
服务器环境要不要设自动挂起?
不要。Ubuntu Server 默认禁用挂起,logind.conf 中 IdleAction=ignore 是安全默认。即使手动开启,服务器常见的后台任务(rsync、apt update、日志轮转)常触发 inhibit,导致挂起失效或误触发。若真需节能,应改用 cpupower 调频或关机策略,而非依赖挂起。
挂起机制本质面向交互式桌面场景,它的“空闲”定义基于用户输入设备与显示活动,对 headless 服务无意义 —— 这点容易被忽略,但恰恰是大多数自动挂起失败的根本原因。


















