如何自动从挂起进入休眠?

Ser*_*nik 62 suspend hibernate power-management

是否有可能让 Ubuntu 从暂停进入休眠状态,也就是“暂停镇静”?

我正在寻找的是:
当我合上盖子时,笔记本电脑被置于暂停状态。然后,在预定的时间后(即使电池电量充足)如果我仍然不使用它,它应该将自己置于休眠状态以节省电池电量。

例如,我的笔记本电脑设置为在我合上盖子后进入暂停状态。如果我一整天不使用它,电池就会耗尽,因为即使在挂起模式下,硬件仍然会消耗少量电量,并且电池最终会放电。我想要的是能够告诉 Ubuntu 即使它被挂起,它仍然需要在几个小时的不活动后进入休眠状态。

Windows 可以做到这一点。Ubuntu 可以被编程为按定时器进入待机休眠状态,但不能同时进入。

PRI*_*LOP 38

Ubuntu 18.04 及更高版本中,它更容易。在systemd中提供了一种新模式suspend-then-hibernate。要开始使用此功能,您需要创建一个包含以下内容的文件/etc/systemd/sleep.conf

[Sleep]
HibernateDelaySec=3600
Run Code Online (Sandbox Code Playgroud)

然后你可以通过命令测试它:

sudo systemctl suspend-then-hibernate
Run Code Online (Sandbox Code Playgroud)

您可以编辑HibernateDelaySec以减少休眠延迟。


如果一切正常,您可以更改盖子关闭操作,为此您需要编辑文件/etc/systemd/logind.conf

您需要找到 option HandleLidSwitch=,取消注释并更改为HandleLidSwitch=suspend-then-hibernate. 然后您需要通过下一个命令重新启动 systemd-logind 服务(警告!您的用户会话将被重新启动):

sudo systemctl restart systemd-logind.service
Run Code Online (Sandbox Code Playgroud)

就这样!现在你可以使用这个不错的功能了。

  • 但是当 GNOME 检测到您空闲时,如何让 GNOME 使用先挂后休眠模式呢?它总是使用挂起,并且似乎没有办法在 GNOME 中配置它。 (2认同)

小智 37

解决这个问题的方法很简单。首先,在挂起和恢复时,pm-suspend 程序在/etc/pm/sleep.d和 中执行一系列脚本/usr/lib/pm-utils/sleep.d。所以我的解决方案是添加一个执行以下操作的脚本:

  1. 挂起时,记录当前时间并使用 rtcwake 注册唤醒事件。
  2. 恢复后,根据上面记录的时间检查当前时间。如果已经过去了足够的时间,那么我们可能因为 rtc 计时器事件而醒来。否则我们会因为用户事件(例如打开笔记本电脑屏幕)而早早醒来。
  3. 如果我们因为 rtc 计时器而醒来,则立即发出“pm-hibernate”命令进入休眠状态。

这是一个执行此操作的脚本。为其命名并将其0000rtchibernate放置在/etc/pm/sleep.d目录中(0000 很重要,因此脚本首先在挂起时执行,最后在恢复时执行)。

#!/bin/bash
# Script name: /etc/pm/sleep.d/0000rtchibernate
# Purpose: Auto hibernates after a period of sleep
# Edit the "autohibernate" variable below to set the number of seconds to sleep.
curtime=$(date +%s)
autohibernate=7200
echo "$curtime $1" >>/tmp/autohibernate.log
if [ "$1" = "suspend" ]
then
    # Suspending.  Record current time, and set a wake up timer.
    echo "$curtime" >/var/run/pm-utils/locks/rtchibernate.lock
    rtcwake -m no -s $autohibernate
fi

if [ "$1" = "resume" ]
then
    # Coming out of sleep
    sustime=$(cat /var/run/pm-utils/locks/rtchibernate.lock)
    rm /var/run/pm-utils/locks/rtchibernate.lock
    # Did we wake up due to the rtc timer above?
    if [ $(($curtime - $sustime)) -ge $autohibernate ]
    then
        # Then hibernate
        rm /var/run/pm-utils/locks/pm-suspend.lock
        /usr/sbin/pm-hibernate
    else
        # Otherwise cancel the rtc timer and wake up normally.
        rtcwake -m no -s 1
    fi
fi
Run Code Online (Sandbox Code Playgroud)

希望这个代码能通过这个留言板(这是我在这里的第一篇文章)。

autohibernate=7200将顶部的超时值编辑为您在进入休眠状态之前要睡觉的秒数。上面的当前值为 2 小时。请注意,您的笔记本电脑将在此时唤醒几秒钟,同时执行休眠功能。

所以如果你打算把你的笔记本电脑放在一个箱子里,不要挂起,而是休眠。否则您的笔记本电脑可能会过热,尤其是。如果它在一个紧密贴合的滑套中(尽管它只会打开几秒钟到一分钟)。

过去几天我一直在使用这种方法,到目前为止它已经成功(并且今天下午使我免于电池耗尽)。享受。

对于使用systemd较新 Ubuntu 版本的其他 Linux 发行版,如果您将脚本放在/usr/lib/systemd/system-sleep而不是/etc/pm/sleep.d. 此外,将/usr/sbin/pm-hibernate命令替换为systemctl hibernate.

  • 这将是一个有用的 Ubuntu/Debian 包! (2认同)

Jan*_*anC 13

用简单的话来解释这是如何工作的(这类似于 Windows):当电池电量不足时,机器不会从待机状态唤醒,以便能够将机器状态保存到交换分区,它会立即将所有内容保存到交换分区在待机状态下,当电池耗尽时,它将通过从交换分区加载状态来恢复(就像你休眠时所做的那样)。

如果 AFAIK linux 知道它适用于您的硬件,它将/应该使用混合待机/休眠而不是“正常”待机。也有可能由于太多错误或其他原因,目前已禁用此功能...;)

如果你喜欢试验,也许你可以看看用pm-suspend-hybrid能不能得到什么好的结果。

如果以下说明您很幸运,那么理论上您的系统支持混合挂起:

pm-is-supported --suspend-hybrid && echo "you're lucky"
Run Code Online (Sandbox Code Playgroud)


aya*_*4m1 6

您可能对s2both感兴趣。它由uswsuspUbuntu 10.10 中的软件包提供。它暂停到磁盘,但不是关闭系统而是将其置于 S3,这是通常与 Ubuntu 中的“暂停”选项相关联的电源模式。pm-suspend-hybrid是另一个声称可以做同样事情的工具。

要在盖子关闭时自动执行此操作,请查看以下指南,该指南允许您在捕获盖子事件时运行任意脚本:

http://ubuntuforums.org/showthread.php?t=1076486

如果您碰巧有一台 ThinkPad,则 的联机帮助页tpctl会引用一个参数--pm-sedation-hibernate-from-suspend-timer,它似乎提供了您正在寻找的功能。我会提醒您不要在非 ThinkPad 硬件上尝试此操作。

作为参考,我查看了hibernate.conf的联机帮助页;它似乎没有任何相关选项,但可能值得一读。


小智 5

Ubuntu 16.04 - 在预定时间后从挂起/睡眠进入休眠状态

在 Ubuntu 16.04 上似乎有些不同,所以我采取的步骤是:

  1. 运行时确保休眠按预期工作

    systemctl hibernate
    
    Run Code Online (Sandbox Code Playgroud)
  2. 复制原始suspend.target文件:

    sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
    
    Run Code Online (Sandbox Code Playgroud)

    然后编辑文件/etc/systemd/system/suspend.target并添加以下行:

    Requires=delayed-hibernation.service
    
    Run Code Online (Sandbox Code Playgroud)

    到该[Unit]文件的部分。

  3. 创建/etc/systemd/system/delayed-hibernation.service包含以下内容的文件:

[单元]
说明=延迟休眠触发
之前=暂停.目标
冲突 = hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[服务]
类型=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/delayed-hibernation.sh 预挂起
ExecStop=/usr/local/bin/delayed-hibernation.sh 挂起后

[安装]
WantedBy=sleep.target
  1. /etc/delayed-hibernation.conf使用以下内容为脚本创建配置文件:
# 'delayed-hibernation.sh'脚本的配置文件

# 指定计算机休眠前进入睡眠模式的时间(以秒为单位)
TIMEOUT=1200 #in 秒,给出 20 分钟
  1. 创建将实际完成艰苦工作的脚本。

    创建/usr/local/bin/delayed-hibernation.sh包含内容的文件:

#!/bin/bash
# 脚本名称:delayed-hibernation.sh
# 目的:睡眠一段时间后自动休眠
# 编辑`$hibernation_conf`文件中的`TIMEOUT`变量,设置休眠秒数。

hibernation_lock='/var/run/delayed-hibernation.lock'
hibernation_fail='/var/run/delayed-hibernation.fail'
hibernation_conf='/etc/delayed-hibernation.conf'

# 检查配置文件
如果 [ !-f $hibernation_conf ]; 然后
    echo "缺少配置文件 ('$hibernation_conf'),正在中止。"
    出口 1
菲
hibernation_timeout=$(grep "^[^#]" $hibernation_conf | grep "TIMEOUT=" | awk -F'=' '{ print $2 }' | awk -F'#' '{print $1}' | tr -d '[[ \t]]')
if [ "$hibernation_timeout" = "" ]; 然后
    echo "配置文件 ('$hibernation_conf') 中缺少 'TIMEOUT' 参数,正在中止。"
    出口 1
elif [[ ! "$hibernation_timeout" =~ ^[0-9]+$ ]]; 然后
    echo "错误的 'TIMEOUT' 参数 ('$hibernation_timeout') 在配置文件 ('$hibernation_conf') 中,预期的秒数,正在中止。"
    出口 1
菲

# 处理给定参数
if [ "$2" = "暂停" ]; 然后
    curtime=$(日期+%s)
    if [ "$1" = "pre" ]; 然后
        如果 [ -f $hibernation_fail ]; 然后
            echo "检测到休眠失败,跳过设置 RTC 唤醒计时器。"
        别的
            echo "检测到暂停。录制时间,设置 RTC 计时器"
            echo "$curtime" > $hibernation_lock
            rtcwake -m no -s $hibernation_timeout
        菲
    elif [ "$1" = "post" ]; 然后
        如果 [ -f $hibernation_fail ]; 然后
            rm $hibernation_fail
        菲
        如果 [ -f $hibernation_lock ]; 然后
            sustime=$(cat $hibernation_lock)
            rm $hibernation_lock
            if [ $(($curtime - $sustime)) -ge $hibernation_timeout ]; 然后
                echo "检测到挂起自动恢复。休眠中..."
                systemctl 休眠
                如果 [$? -ne 0 ]; 然后
                    echo "自动休眠失败。尝试挂起。"
                    触摸 $hibernation_fail
                    systemctl 挂起
                    如果 [$? -ne 0 ]; 然后
                        echo "自动休眠和挂起故障转移失败。没有其他可尝试的。"
                    菲
                菲
            别的
                echo "检测到从挂起手动恢复。清除 RTC 计时器"
                rtcwake -m 禁用
            菲
        别的
            echo "未找到文件 '$hibernation_lock',无事可做"
        菲
    别的
        echo "无法识别的第一个参数:'$1',预期为 'pre' 或 'post'"
    菲
别的
    echo "此脚本旨在由 systemctl delay-hibernation.service 运行(预期第二个参数:'暂停')"
菲
  1. 使脚本可执行:
chmod 755 /usr/local/bin/delayed-hibernation.sh

我花了很多时间才根据该线程中的其他回复编写这个脚本,我在互联网上找到的东西,如https://bbs.archlinux.org/viewtopic.php?pid=1554259

我的脚本版本尝试处理许多问题,例如如果休眠未成功则再次进入挂起状态,但在预定时间后一遍又一遍地不再唤醒。

  1. 我认为最后一步就是执行

    sudo systemctl daemon-reload
    sudo systemctl enable delayed-hibernation.service 
    
    Run Code Online (Sandbox Code Playgroud)

    以确保正在使用新的服务/配置。

要检查服务日志,您可以使用:

须藤 systemctl 状态延迟 hibernation.service

或服务使用的完整日志:

须藤 journalctl -u 延迟休眠.服务

我从正在运行的服务中获得的正常日志是:

mile@mile-ThinkPad:~$ sudo systemctl status delay-hibernation.service 
? delay-hibernation.service - 延迟休眠触发器
   已加载:已加载(/etc/systemd/system/delayed-hibernation.service;已启用;供应商预设:已启用)
   活动:不活动(死)

Jun 09 20:35:42 mile-ThinkPad systemd[1]:启动延迟休眠触发器...
6 月 9 日 20:35:42 英里-ThinkPad 延迟休眠.sh[2933]:检测到挂起。录音时间,设置RTC定时器
6 月 9 日 20:35:42 英里-ThinkPad 延迟休眠.sh[2933]:rtcwake:假设 RTC 使用 UTC ...
6 月 9 日 20:35:42 英里-ThinkPad 延迟休眠.sh[2933]:rtcwake:在 2016 年 6 月 9 日星期四 18:55:43 使用 /dev/rtc0 唤醒
Jun 09 20:55:44 mile-ThinkPad systemd[1]:开始延迟休眠触发。
Jun 09 20:55:44 mile-ThinkPad systemd[1]:delay-hibernation.service:不再需要该单元。停止。
Jun 09 20:55:44 mile-ThinkPad systemd[1]:停止延迟休眠触发器...
6 月 9 日 20:55:44 英里-ThinkPad 延迟-hibernation.sh[3093]:检测到从挂起自动恢复。冬眠...
Jun 09 20:55:44 mile-ThinkPad systemd[1]:停止延迟休眠触发。
英里@英里-ThinkPad:~$ 

所以就是这样,我希望它真的对某人有所帮助,因为我花了几天时间试图找出配置和脚本版本的正确组合,以使这个方便的功能工作。