挂起期间超时关闭系统

挂起期间超时关闭系统

目前,我在 GNOME 电源管理中设置了超时,之后我的系统将挂起。

我想添加一个额外的超时,以便系统在挂起期间处于不活动状态一段时间后关闭。

所以它看起来像这样:

  1. 15 分钟不活动后暂停。
  2. 暂停期间不活动 12 小时后关闭。

答案1

如果休眠没问题,请使用 systemd suspend-then-hibernate,它会在超时后休眠挂起的系统。设置sleep.confHibernateDelaySec=您想要的值。

来源官方系统手册


编辑:

为了使用休眠功能,Fedora 需要重新配置才能启用它。

  1. 首先你需要一个交换分区至少RAM 的大小 - 休眠意味着将 RAM 的内容保存到交换分区,因此大小是不言自明的。通常这意味着缩小当前分区并创建新的交换分区。

这方面的指南在这里:

不要忘记添加交换分区/etc/fstab并通过 激活使用swapon -a。 fstab 条目示例:

# swap:
UUID=abc123-this-is-a-uuid none swap sw 0 0
  1. 将恢复选项添加到 initramfs。 Fedora 用于dracut此目的,我将遵循本指南
  • /etc/dracut.conf.d/resume.conf使用该行创建一个文件add_dracutmodules+=" resume "(确保不要忘记空格)
  • 跑步dracut -f
  1. 将交换分区添加到 grub,以便它知道从哪里恢复:
  • 寻找/etc/default/grub线路GRUB_CMDLINE_LINUX=
  • 添加resume=UUID=abc123-this-is-a-uuid(即交换UUID)
  • 更新grubgrub2-mkconfig -o /boot/grub2/grub.cfg或者grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
  1. 我认为这没有必要,但不会造成伤害。激活休眠/etc/systemd/sleep.conf

    [Sleep]
    AllowHibernation=yes
    HibernateMode=shutdown
    
  2. 重新启动并测试休眠:打开一些窗口,运行systemctl hibernate.它应该关闭,并且窗口会在您重新启动后恢复。

答案2

Fedorasystemd作为系统的总体管理器,Gnome 默认将睡眠/待机/挂起操作中继到systemd.

假设“挂起”的意思是“挂起到 RAM”(与“挂起到磁盘”相对),“关机”的意思是字面上的“关闭机器电源”,并且还假设机器装有支持系统唤醒并因此在 BIOS/EFI 中启用作为可接受的唤醒设备的硬件时钟,可以systemd通过一些精心设计的“单元”(如systemd用语)进行配置,以便在经过指定时间后实现自断电处于“挂起”状态,同时在转换期间根本不涉及休眠(也不涉及任何专用交换/分区)。

这些自定义systemd单元本质上是在进入“挂起”状态之前立即进行唤醒[Timer],一旦警报触发,系统就会被唤醒以执行[Service][Timer].这[Service]当然执行断电操作。如果机器通过其他方式唤醒,因此计时器尚未超时,则不会执行自动关机并完全取消。

systemd我为实现此类逻辑而提出的单元相当多,因此这里有一个安装所有这些单元的 shell 脚本。该脚本只需以“root”身份运行一次(通过sudo即可),以便在全系统(不是用户范围的)配置systemd

#!/bin/sh --

sysd=/etc/systemd/system

set -e

mkdir -p "$sysd/systemd-suspend.service.d"

cat > "$sysd/systemd-suspend.service.d/99-trigger-system-back-after-suspend.conf" <<'EOF'
[Service]
ExecStopPost=-/bin/systemctl --no-block start system-is-back-after-suspend.target
EOF

cat > "$sysd/cancel-self-poweroff.service" <<'EOF'
[Unit]
Description=Cancel self-poweroff after suspend
After=system-is-back-after-suspend.target
Conflicts=self-poweroff.timer

[Service]
Type=oneshot
ExecStart=/bin/rm -f /run/systemd/system/self-poweroff.timer

[Install]
WantedBy=system-is-back-after-suspend.target
EOF

cat > "$sysd/self-poweroff.service" <<'EOF'
[Unit]
Description=Actual self-poweroff after suspend
After=suspend.target 
Before=system-is-back-after-suspend.target
RefuseManualStart=true

[Service]
Type=oneshot
ExecStart=/bin/systemctl --no-block poweroff
# Uncomment the following line while commenting out the above line for testing.
#ExecStart=/bin/echo poweroff
# Note the echoed string goes to systemd journal log.
# Do a `systemctl daemon-reload` after modifying this file.
EOF

cat > "$sysd/schedule-self-poweroff.service" <<'EOF'
[Unit]
Description=Schedulation of self-poweroff after some time spent in suspend state
Before=systemd-suspend.service
Requisite=suspend.target

[Service]
Type=oneshot
EnvironmentFile=/etc/self-poweroff.conf
ExecStartPre=/bin/sh -c 'printf -- %%s\\\\n "[Timer]" "Persistent=yes" "OnCalendar=$(date -d "now + ${MY_SUSPEND_TIMEOUT}" "+%%Y-%%m-%%d %%H:%%M:%%S")" "AccuracySec=1s" "WakeSystem=yes" >| /run/systemd/system/self-poweroff.timer'
ExecStart=/bin/systemctl start self-poweroff.timer
# On systemd 237 onwards (Fedora 28 onwards) you may uncomment the line below while commenting out the above ExecStart and ExecStartPre lines
#ExecStart=/bin/sh -c 'systemd-run --on-calendar="$(date -d "now + ${MY_SUSPEND_TIMEOUT}" "+%%Y-%%m-%%d %%H:%%M:%%S")" --timer-property=AccuracySec=1s --timer-property=WakeSystem=yes --timer-property=Persistent=yes --unit=self-poweroff.service'
# Do a `systemctl daemon-reload` after modifying this file.

[Install]
WantedBy=suspend.target
EOF

cat > "$sysd/system-is-back-after-suspend.target" <<'EOF'
[Unit]
Description=Synchronization point for self-poweroff after suspend
DefaultDependencies=no
After=suspend.target
StopWhenUnneeded=yes
EOF

cat > /etc/self-poweroff.conf <<'EOF'
MY_SUSPEND_TIMEOUT=12 hours
EOF

systemctl enable schedule-self-poweroff.service cancel-self-poweroff.service
systemctl daemon-reload

运行脚本来安装单元后,您可以更改专用/etc/self-poweroff.conf文件中的超时,该文件也是由脚本创建的。在那里,您可以将MY_SUSPEND_TIMEOUT变量设置为您想要的任何时间量,并且您可以根据命令的日期解析能力以hours和/或分钟 ( mins) 和/或秒 ( ) 表示时间。secsdate -d

答案3

在不知道完整答案的情况下,但编辑/etc/systemd/logind.conf和添加以下行可能会对您的搜索有所帮助。

IdleAction=poweroff
IdleActionSec=720min

这将在 12 小时的“空闲”时间后关闭系统电源。但我不确定如果会话被挂起,是否会报告为空闲。

相关内容