Как автоматически перейти из Suspend в Hibernate?

Можно ли перевести Ubuntu в состояние гибернации из Suspend, также известного как «Suspend Sedation»?

Что я ищу, так это:
Когда я закрываю крышку, ноутбук ставится в Suspend. Затем, по прошествии заданного времени (даже если батарея разряжается), если я все еще не использую ее, она должна перейти в режим гибернации для экономии заряда батареи.

Например, мой ноутбук настроен на переход в режим ожидания после того, как я закрою крышку. Если я не использую его в течение всего дня, батарея разряжается, потому что даже в режиме ожидания оборудование все еще потребляет небольшое количество энергии, и батарея в конечном итоге разряжается. Я хочу сказать Ubuntu, что даже если он приостановлен, он все равно должен войти в Hibernate после нескольких часов бездействия.

Windows может сделать это. Ubuntu может быть запрограммирован на переход в режим ожидания или в спящий режим по таймеру, но не в оба.

53
задан 8 March 2019 в 22:17

10 ответов

В Ubuntu 18.04 это намного проще. В systemd доступен новый режим suspend-then-hibernate . Чтобы начать использовать эту функцию, вам нужно создать файл /etc/systemd/sleep.conf со следующим содержанием:

[Sleep]
HibernateDelaySec=3600

Затем вы можете протестировать его по команде:

sudo systemctl suspend-then-hibernate

вы можете отредактировать HibernateDelaySec, чтобы уменьшить задержку до спящего режима.


Если все работает нормально, вы можете изменить Lid Close Action, для этого вам нужно отредактировать файл /etc/systemd/logind.conf

Вам нужно найти опция HandleLidSwitch=, раскомментируйте ее и измените на HandleLidSwitch=suspend-then-hibernate. Затем вам нужно перезапустить службу systemd-logind (предупреждение! Ваш пользовательский сеанс будет перезапущен) следующей командой:

sudo systemctl restart systemd-logind.service

Вот и все! Теперь вы можете использовать эту замечательную функцию.

0
ответ дан 8 March 2019 в 22:17

Решение этого простое. Во-первых, после приостановки и возобновления программа pm-suspend выполняет серию сценариев в /etc/pm/sleep.d и /usr/lib/pm-utils/sleep.d. Поэтому я решил добавить скрипт, который выполняет следующие действия:

  1. После приостановки запишите текущее время и зарегистрируйте событие пробуждения, используя rtcwake.
    [ 1114]
  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

Надеюсь, этот код появится на этой доске объявлений (это мой первый пост здесь).

Измените значение тайм-аута autohibernate=7200 вверху, чтобы вы могли поспать сколько угодно секунд, прежде чем перейти в спящий режим. Текущее значение выше - 2 часа. Обратите внимание, что ваш ноутбук БУДЕТ просыпаться в это время на несколько секунд, пока он выполняет функцию гибернации.

Так что, если вы планируете положить ноутбук в футляр, не приостанавливайте, а вместо этого переходите в спящий режим. В противном случае ваш ноутбук может перегреться в ESP. если он находится в плотно прилегающем футляре (хотя он будет включаться только от нескольких секунд до минуты).

Я использовал этот метод последние пару дней, и пока он был успешным (и спас меня от разряженной батареи сегодня днем). Наслаждайтесь.

Для других дистрибутивов Linux, использующих systemd и более новые версии Ubuntu, это все равно должно работать, если вы поместите скрипт в /usr/lib/systemd/system-sleep вместо /etc/pm/sleep.d. Также замените команду /usr/sbin/pm-hibernate на systemctl hibernate.

0
ответ дан 8 March 2019 в 22:17

Чтобы объяснить, как это работает (это похоже на Windows), простыми словами: машина не выходит из режима ожидания, когда батарея разряжается, чтобы иметь возможность сохранить состояние машины в раздел подкачки, она сохраняет все в Поменяйте раздел немедленно в режиме ожидания, и когда батарея разрядится, он восстановится после загрузки состояния из раздела подкачки (как это произошло бы в случае перехода в спящий режим).

AFAIK linux будет / должен использовать гибридный режим ожидания / гибернацию вместо «нормального» режима ожидания, если он знает, что он работает на вашем оборудовании. Также возможно, что в настоящее время это отключено из-за слишком большого количества ошибок или чего-то ...;)

Если вам нравится экспериментировать, возможно, вы сможете увидеть, можете ли вы получить какие-либо хорошие результаты с pm-suspend- Гибридный .

Если следующее говорит, что вам повезло, то теоретически гибридная приостановка поддерживается в вашей системе:

pm-is-supported --suspend-hybrid && echo "you're lucky"
0
ответ дан 8 March 2019 в 22:17

На всякий случай, если во время pm-hibernate что-то пойдет не так, я бы предпочел приостановить работу компьютера, а не запускать его. Таким образом, вы можете использовать:

   ...
/usr/sbin/pm-hibernate || /usr/sbin/pm-suspend
   ...
0
ответ дан 8 March 2019 в 22:17

Вас может заинтересовать s2both . Он предоставляется пакетом uswsusp в Ubuntu 10.10. Он приостанавливается на диск, но вместо выключения системы вместо этого переводит его в режим S3, который является режимом питания, обычно связанным с опцией «Suspend» в Ubuntu. pm-suspend-hybrid - это еще один инструмент, который делает то же самое.

Чтобы сделать это автоматизированным при закрытии крышки, взгляните на следующее руководство, которое позволяет запускать произвольный скрипт при обнаружении события крышки:

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

Если у вас есть ThinkPad, на странице справки для tpctl есть ссылка на аргумент --pm-sedation-hibernate-from-suspend-timer, который, кажется, предоставляет вам интересующую вас функцию. за. Я бы предостерег вас от попыток сделать это на оборудовании, отличном от ThinkPad.

Для справки я просмотрел справочную страницу для hibernate.conf ; у этого, казалось, не было никаких соответствующих вариантов, но могло бы стоить второго чтения.

0
ответ дан 8 March 2019 в 22:17

Вот обновленная версия ответа Дерека Прессналла , который работает с systemd и включает предложение Элии Кагана , просто добавьте его в / usr / lib / systemd / system-sleep /delayed_hibernation.sh и сделайте его исполняемым:

#!/bin/bash

hibernation_timeout=1800  #30 minutes

if [ "$2" = "suspend" ]; then
    curtime=$(date +%s)
    if [ "$1" = "pre" ]; then
        echo -e "[($curtime) $@]\nExecuting pre-suspend hook..." >> /tmp/delayed_hibernation.log
        echo "$curtime" > /var/run/delayed_hibernation.lock
        rtcwake -m no -s $hibernation_timeout
    elif [ "$1" = "post" ]; then
        echo -e "[($curtime) $@]\nExecuting post-suspend hook..." >> /tmp/delayed_hibernation.log
        sustime=$(cat /var/run/delayed_hibernation.lock)
        if [ $(($curtime - $sustime)) -ge $hibernation_timeout ]; then
            echo -e "Automatic resume detected, hibernating.\n" >> /tmp/delayed_hibernation.log
            systemctl hibernate || systemctl suspend
        else
            echo -e "Manual resume detected, clearing RTC alarm.\n" >> /tmp/delayed_hibernation.log
            rtcwake -m no -s 1
        fi
        rm /var/run/delayed_hibernation.lock
    fi
fi
0
ответ дан 8 March 2019 в 22:17

Вот мой рецепт (тестировал его на двух ноутбуках Ubuntu 16.04):

Поместите этот скрипт куда хотите (я помещаю его в root, /syspend.sh) и сделайте его исполняемым (chmod +x /suspend.sh) [ 1111]

TIMELOG=/tmp/autohibernate.log
ALARM=$(tail -n 1 $TIMELOG)
SLEEPTIME=5000 #edit this line to change timer, e.g. 2 hours "$((2*60*60))"
if [[ $1 == "resume" ]]
then
    if [[ $(date +%s) -ge $(( $ALARM + $SLEEPTIME )) ]]
    then
        echo "hibernate triggered $(date +%H:%M:%S)">>$TIMELOG
        systemctl hibernate 2>> $TIMELOG
    else
        echo "normal wakeup $(date +%H:%M:%S)">>$TIMELOG
    fi
elif [[ $1 == "suspend" ]]
then
    echo "$(date +%s)" >> $TIMELOG
    rtcwake -m no -s $SLEEPTIME
fi

Затем создайте цель systemd: # touch /etc/systemd/system/suspend-to-sleep.target Вставьте это содержимое:

#/etc/systemd/system/suspend-to-hibernate.service
[Unit]
Description=Delayed hibernation trigger
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash /suspend.sh suspend
ExecStop=/bin/bash /suspend.sh wakeup

[Install]
WantedBy=sleep.target
RequiredBy=suspend.target

Затем включите его # systemctl enable suspend-to-sleep.target.

1114 Я столкнулся с проблемой на одном из ноутбуков: закрытие крышки не сработало. Это было связано с xfce4-power-manager. Есть два способа обойти эту проблему. Первый - отредактировать файл /etc/systemd/logind.conf и заменить HandleLidSwitch=ignore на HandleLidSwitch=suspend. Но он будет общесистемным, поэтому я просто добавил символическую ссылку в свой скрипт # ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate

0
ответ дан 8 March 2019 в 22:17

Еще один более распространенный обходной путь, который вы можете использовать hybrid-sleep (как это делает Mac OS). Если ваш компьютер поддерживает спящий режим, вы можете использовать эту функцию:

systemctl hybrid-sleep

Эта команда должна приостановить и отправить на диск (в спящем режиме) компьютер. Через некоторое время компьютер выключится (при включении он будет использовать файлы гибернации для пробуждения).

с .: Я знаю, что это не совсем то, что опубликовал ОП, но это довольно близко.

0
ответ дан 8 March 2019 в 22:17

Ubuntu 16.04 - from suspend/sleep into hibernate after a pre-determined time

It seems that on Ubuntu 16.04 things are a little different, so steps I took to make it work were:

  1. Make sure hibernate is working as expected when running

    systemctl hibernate
    
  2. Copy the original suspend.target file:

    sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
    

    Then edit the file /etc/systemd/system/suspend.target and add the line:

    Requires=delayed-hibernation.service
    

    to the [Unit] section of that file.

  3. Create the file /etc/systemd/system/delayed-hibernation.service with the following content:

[Unit]
Description=Delayed hibernation trigger
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/delayed-hibernation.sh pre suspend
ExecStop=/usr/local/bin/delayed-hibernation.sh post suspend

[Install]
WantedBy=sleep.target
  1. Create the configuration file /etc/delayed-hibernation.conf for the script with the following content:
# Configuration file for 'delayed-hibernation.sh' script

# Specify the time in seconds to spend in sleep mode before the computer hibernates
TIMEOUT=1200  #in seconds, gives 20 minutes
  1. Create the script which will actually does the hard work.

    Create file /usr/local/bin/delayed-hibernation.sh with the content:

#!/bin/bash
# Script name: delayed-hibernation.sh
# Purpose: Auto hibernates after a period of sleep
# Edit the `TIMEOUT` variable in the `$hibernation_conf` file to set the number of seconds to sleep.

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

# Checking the configuration file
if [ ! -f $hibernation_conf ]; then
    echo "Missing configuration file ('$hibernation_conf'), aborting."
    exit 1
fi
hibernation_timeout=$(grep "^[^#]" $hibernation_conf | grep "TIMEOUT=" | awk -F'=' '{ print $2 }' | awk -F'#' '{print $1}' | tr -d '[[ \t]]')
if [ "$hibernation_timeout" = "" ]; then
    echo "Missing 'TIMEOUT' parameter from configuration file ('$hibernation_conf'), aborting."
    exit 1
elif [[ ! "$hibernation_timeout" =~ ^[0-9]+$ ]]; then
    echo "Bad 'TIMEOUT' parameter ('$hibernation_timeout') in configuration file ('$hibernation_conf'), expected number of seconds, aborting."
    exit 1
fi

# Processing given parameters
if [ "$2" = "suspend" ]; then
    curtime=$(date +%s)
    if [ "$1" = "pre" ]; then
        if [ -f $hibernation_fail ]; then
            echo "Failed hibernation detected, skipping setting RTC wakeup timer."
        else
            echo "Suspend detected. Recording time, set RTC timer"
            echo "$curtime" > $hibernation_lock
            rtcwake -m no -s $hibernation_timeout
        fi
    elif [ "$1" = "post" ]; then
        if [ -f $hibernation_fail ]; then
            rm $hibernation_fail
        fi
        if [ -f $hibernation_lock ]; then
            sustime=$(cat $hibernation_lock)
            rm $hibernation_lock
            if [ $(($curtime - $sustime)) -ge $hibernation_timeout ]; then
                echo "Automatic resume from suspend detected. Hibernating..."
                systemctl hibernate
                if [ $? -ne 0 ]; then
                    echo "Automatic hibernation failed. Trying to suspend instead."
                    touch $hibernation_fail
                    systemctl suspend
                    if [ $? -ne 0 ]; then
                        echo "Automatic hibernation and suspend failover failed. Nothing else to try."
                    fi
                fi
            else
                echo "Manual resume from suspend detected. Clearing RTC timer"
                rtcwake -m disable
            fi
        else
            echo "File '$hibernation_lock' was not found, nothing to do"
        fi
    else
        echo "Unrecognised first parameter: '$1', expected 'pre' or 'post'"
    fi
else
    echo "This script is intended to be run by systemctl delayed-hibernation.service (expected second parameter: 'suspend')"
fi
  1. Make the script executable:
chmod 755 /usr/local/bin/delayed-hibernation.sh

It took me quite a lot until writing this script based on other replies in this thread, things I found on the internet like https://bbs.archlinux.org/viewtopic.php?pid=1554259

My version of the script tries to deal with many problems like go into suspend again if hibernate was not successful but do not wake again after the pre-determined time over and over.

  1. Final step I assume would be to just execute

    sudo systemctl daemon-reload
    sudo systemctl enable delayed-hibernation.service 
    

    to make sure new service/configurations are being used.

To check the service log, you can use:

sudo systemctl status delayed-hibernation.service

or for a complete log of the service use:

sudo journalctl -u delayed-hibernation.service

A normal log I get from the running service is:

mile@mile-ThinkPad:~$ sudo systemctl status delayed-hibernation.service 
● delayed-hibernation.service - Delayed hibernation trigger
   Loaded: loaded (/etc/systemd/system/delayed-hibernation.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

Jun 09 20:35:42 mile-ThinkPad systemd[1]: Starting Delayed hibernation trigger...
Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh[2933]: Suspend detected. Recording time, set RTC timer
Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh[2933]: rtcwake: assuming RTC uses UTC ...
Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh[2933]: rtcwake: wakeup using /dev/rtc0 at Thu Jun  9 18:55:43 2016
Jun 09 20:55:44 mile-ThinkPad systemd[1]: Started Delayed hibernation trigger.
Jun 09 20:55:44 mile-ThinkPad systemd[1]: delayed-hibernation.service: Unit not needed anymore. Stopping.
Jun 09 20:55:44 mile-ThinkPad systemd[1]: Stopping Delayed hibernation trigger...
Jun 09 20:55:44 mile-ThinkPad delayed-hibernation.sh[3093]: Automatic resume from suspend detected. Hibernating...
Jun 09 20:55:44 mile-ThinkPad systemd[1]: Stopped Delayed hibernation trigger.
mile@mile-ThinkPad:~$ 

So This would be it, I hope it really helps someone since I spent days trying to figure out the right combination of configurations and script versions to make this handy feature work.

5
ответ дан 8 March 2019 в 22:17

Не забудьте chmod + x этот файл, сделайте его исполняемым.

Есть другое решение без rtcwake, использующее wakealarm в / sys / class / rtc / rtc0. Используйте устаревший код в pm-functions (/ usr / lib / pm-utils) после комментариев #, поскольку ядро ​​не поддерживает напрямую ..., (потому что текущее ядро ​​(после 3.6 что-то) поддерживает напрямую). Верните этот код и вставьте часть do_suspend () вместо do_suspend_hybrid ().

Устаревший код (приостановить, а затем перейти в спящий режим при вызове suspend_hybrid):

# since the kernel does not directly support hybrid sleep, we do
# something else -- suspend and schedule an alarm to go into
# hibernate if we have slept long enough.
# Only do this if we do not need to do any special video hackery on resume
# from hibernate, though.
if [ -z "$SUSPEND_HYBRID_MODULE" -a -w "$PM_RTC/wakealarm" ] && \
    check_suspend && check_hibernate && ! is_set $HIBERNATE_RESUME_POST_VIDEO; \
    then
    SUSPEND_HYBRID_MODULE="kernel"
    do_suspend_hybrid() {
    WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
    echo >"$PM_RTC/wakealarm"
    echo $WAKETIME > "$PM_RTC/wakealarm"
    if do_suspend; then
        NOW=$(cat "$PM_RTC/since_epoch")
        if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then
        log "Woken by RTC alarm, hibernating."
        # if hibernate fails for any reason, go back to suspend.
        do_hibernate || do_suspend
        else
        echo > "$PM_RTC/wakealarm"
        fi
    else
        # if we cannot suspend, just try to hibernate.
        do_hibernate
    fi
    }
fi

Рекомендуется. Еще проще использовать uswsusp, в то же время максимизируя преимущества s2both, то есть s2both при приостановке. Поместите возвращенный код в do_suspend () часть модуля uswsusp (/usr/lib/pm-utils/module.d).

Обращенный код (suspend_hybrid, когда вызывается suspend):

WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
echo >"$PM_RTC/wakealarm"
echo $WAKETIME > "$PM_RTC/wakealarm"
if do_suspend_hybrid; then
    NOW=$(cat "$PM_RTC/since_epoch")
    if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
    log "Woken by RTC alarm, hibernating."
    # if hibernate fails for any reason, go back to suspend_hybrid.
    do_hibernate || do_suspend_hybrid
    else
    echo > "$PM_RTC/wakealarm"
    fi
else
    # when do_suspend is being called, convert to suspend_hybrid.
    do_suspend_hybrid
fi      

С помощью uswsusp мы можем видеть ход приостановки / гибернации и обратный процесс, отображаемый в тексте, даже если мы можем его прервать нажав клавишу возврата. Без uswsusp suspend / hibernate просто раздражающе появляется-исчезает, особенно когда срабатывает wakealarm и выполняется hibernate (s2disk в uswsusp). Установите период сна до гибернации в обычном месте в файле pm-functions.

# variables to handle hibernate after suspend support
PM_HIBERNATE_DELAY=900  # 15 minutes
PM_RTC=/sys/class/rtc/rtc0

Вот мод uswsusp: (помните, этот модуль вызывается из pm-функций, поэтому вставленные переменные одинаковые)

#!/bin/sh

# disable processing of 90chvt and 99video.
# s2ram and s2disk handle all this stuff internally.
uswsusp_hooks()
{
    disablehook 99video "disabled by uswsusp"
}

# Since we disabled 99video, we need to take responsibility for proper
# quirk handling.  s2ram handles all common video quirks internally,
# so all we have to do is translate the HAL standard options to s2ram options.
uswsusp_get_quirks()
{
    OPTS=""
    ACPI_SLEEP=0
    for opt in $PM_CMDLINE; do
        case "${opt##--quirk-}" in # just quirks, please
            dpms-on)       ;; # no-op
            dpms-suspend)      ;; # no-op
            radeon-off)        OPTS="$OPTS --radeontool" ;;
            reset-brightness)  ;; # no-op
            s3-bios)       ACPI_SLEEP=$(($ACPI_SLEEP + 1)) ;;
            s3-mode)       ACPI_SLEEP=$(($ACPI_SLEEP + 2)) ;;
            vbe-post)      OPTS="$OPTS --vbe_post" ;;
            vbemode-restore)   OPTS="$OPTS --vbe_mode" ;;
            vbestate-restore)  OPTS="$OPTS --vbe_save" ;;
            vga-mode-3)        ;; # no-op
            save-pci)          OPTS="$OPTS --pci_save" ;;
            none)          QUIRK_NONE="true" ;;
            *) continue ;;
        esac
    done
    [ $ACPI_SLEEP -ne 0 ] && OPTS="$OPTS --acpi_sleep $ACPI_SLEEP"
    # if we were told to ignore quirks, do so.
    # This is arguably not the best way to do things, but...
    [ "$QUIRK_NONE" = "true" ] && OPTS=""
}

# Since we disabled 99video, we also need to handle displaying
# help info for the quirks we handle.
uswsusp_help()
{
    echo  # first echo makes it look nicer.
    echo "s2ram video quirk handler options:"
    echo
    echo "  --quirk-radeon-off"
    echo "  --quirk-s3-bios"
    echo "  --quirk-s3-mode"
    echo "  --quirk-vbe-post"
    echo "  --quirk-vbemode-restore"
    echo "  --quirk-vbestate-restore"
    echo "  --quirk-save-pci"
    echo "  --quirk-none"
}

# This idiom is used for all sleep methods.  Only declare the actual
# do_ method if:
# 1: some other sleep module has not already done so, and
# 2: this sleep method can actually work on this system.
#
# For suspend, if SUSPEND_MODULE is set then something else has already
# implemented do_suspend.  We could just check to see of do_suspend was
# already declared using command_exists, but using a dedicated environment
# variable makes it easier to debug when we have to know what sleep module
# ended up claiming ownership of a given sleep method.
if [ -z "$SUSPEND_MODULE" ] && command_exists s2ram && \
    ( grep -q mem /sys/power/state || \
        ( [ -c /dev/pmu ] && check_suspend_pmu; ); ); then
    SUSPEND_MODULE="uswsusp"
    do_suspend()
    {
        WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
        echo >"$PM_RTC/wakealarm"
        echo $WAKETIME > "$PM_RTC/wakealarm"
        if do_suspend_hybrid; then
            NOW=$(cat "$PM_RTC/since_epoch")
            if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
            log "Woken by RTC alarm, hibernating."
            # if hibernate fails for any reason, go back to suspend_hybrid.
            do_hibernate || do_suspend_hybrid
            else
            echo > "$PM_RTC/wakealarm"
            fi
        else
            # when do_suspend is being called, convert to suspend_hybrid.
            do_suspend_hybrid
        fi      
    }
fi

if [ -z "$HIBERNATE_MODULE" ] && \
    [ -f /sys/power/disk ] && \
    grep -q disk /sys/power/state && \
    [ -c /dev/snapshot ] &&
    command_exists s2disk; then
    HIBERNATE_MODULE="uswsusp"
    do_hibernate()
    {
        s2disk
    }
fi

if [ -z "$SUSPEND_HYBRID_MODULE" ] && 
    grep -q mem /sys/power/state && \
    command_exists s2both && \
    check_hibernate; then
    SUSPEND_HYBRID_MODULE="uswsusp"
    do_suspend_hybrid()
    {   
        uswsusp_get_quirks
        s2both --force $OPTS 
    }
    if [ "$METHOD" = "suspend_hybrid" ]; then
        add_before_hooks uswsusp_hooks
        add_module_help uswsusp_help
    fi
fi  
0
ответ дан 8 March 2019 в 22:17

Другие вопросы по тегам:

Похожие вопросы: