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

В любом KDE 4 + есть приложение под названием «Системные настройки».

Вы найдете раздел «Ярлыки и жесты». Вы найдете все возможные действия и сможете назначить любую клавиатуру любому жесту и даже создать свои собственные.

Не бойтесь его, он очень прост в использовании, и вы можете установить " основные ярлыки "и" альтернативные ярлыки ", поэтому вам даже не нужно удалять оригинал:)

44
задан 7 April 2011 в 03:31

64 ответа

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

После приостановки записи текущего времени и регистрации события пробуждения с использованием rtcwake. После возобновления проверьте текущее время на указанное время сверху. Если прошло достаточно времени, мы, вероятно, проснулись из-за события таймера rtc. В противном случае мы рано проснулись из-за пользовательского события (например, открытия экрана ноутбука). Если мы проснулись из-за таймера 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.

32
ответ дан 26 May 2018 в 00:30
  • 1
    Он работал здесь, но только после того, как я chmoded файл, чтобы добавить X для всех. Я огромный новичок, и мне потребовалось 2 дня, чтобы понять. Очень хороший сценарий, и я надеюсь, что это поможет любому, у кого возникнут проблемы. Спасибо. – user 29 March 2012 в 22:27
  • 2
    Он работал здесь, но только после того, как я chmoded файл, чтобы добавить X для всех. Я огромный новичок, и мне потребовалось 2 дня, чтобы понять. Очень хороший сценарий, и я надеюсь, что это поможет любому, у кого возникнут проблемы. Спасибо. – user 29 March 2012 в 22:27
  • 3
    Он работал здесь, но только после того, как я chmoded файл, чтобы добавить X для всех. Я огромный новичок, и мне потребовалось 2 дня, чтобы понять. Очень хороший сценарий, и я надеюсь, что это поможет любому, у кого возникнут проблемы. Спасибо. – user 29 March 2012 в 22:27
  • 4
    Он работал здесь, но только после того, как я chmoded файл, чтобы добавить X для всех. Я огромный новичок, и мне потребовалось 2 дня, чтобы понять. Очень хороший сценарий, и я надеюсь, что это поможет любому, у кого возникнут проблемы. Спасибо. – user 29 March 2012 в 22:27
  • 5
    Он работал здесь, но только после того, как я chmoded файл, чтобы добавить X для всех. Я огромный новичок, и мне потребовалось 2 дня, чтобы понять. Очень хороший сценарий, и я надеюсь, что это поможет любому, у кого возникнут проблемы. Спасибо. – user 29 March 2012 в 22:27
  • 6
    Он работал здесь, но только после того, как я chmoded файл, чтобы добавить X для всех. Я огромный новичок, и мне потребовалось 2 дня, чтобы понять. Очень хороший сценарий, и я надеюсь, что это поможет любому, у кого возникнут проблемы. Спасибо. – user 29 March 2012 в 22:27
  • 7
    Это сделает полезный пакет Ubuntu / Debian! – Petr Pudlák 10 December 2012 в 14:26
  • 8
    Просто интересно: будет ли это справедливо для Ubuntu 13.04? Мне нужно именно это решение, но я не хочу возиться с ноутбуком жены, если окажется, что он сломает вещи на более новых версиях. – Torben Gundtofte-Bruun 17 September 2013 в 11:33
  • 9
    Спасибо за скрипт. Работает отлично для меня на Ubuntu 14.04! Одно улучшение было бы, если когда ноутбук просыпается до спящего режима, он может проверить, подключен ли он к сети переменного тока. Если это так, я бы хотел, чтобы он снова приостанавливался вместо спячки. Восстановление из спящего режима занимает больше времени, и мне не нужно его спящий режим, когда он подключен ... – maddentim 6 June 2014 в 19:19
  • 10
    Огромное спасибо!!!! Этот сценарий - волшебство, о котором я мечтал !! – yanpas 10 August 2015 в 23:42

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

После приостановки записи текущего времени и регистрации события пробуждения с использованием rtcwake. После возобновления проверьте текущее время на указанное время сверху. Если прошло достаточно времени, мы, вероятно, проснулись из-за события таймера rtc. В противном случае мы рано проснулись из-за пользовательского события (например, открытия экрана ноутбука). Если мы проснулись из-за таймера 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.

32
ответ дан 25 July 2018 в 22:54

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

После приостановки записи текущего времени и регистрации события пробуждения с использованием rtcwake. После возобновления проверьте текущее время на указанное время сверху. Если прошло достаточно времени, мы, вероятно, проснулись из-за события таймера rtc. В противном случае мы рано проснулись из-за пользовательского события (например, открытия экрана ноутбука). Если мы проснулись из-за таймера 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.

33
ответ дан 2 August 2018 в 04:18

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

  1. После приостановки запишите текущее время и зарегистрируйте событие пробуждения, используя rtcwake.
  2. После возобновления проверьте текущее время относительно записанного времени сверху. Если прошло достаточно времени, мы, вероятно, проснулись из-за события таймера rtc. В противном случае мы рано проснулись из-за пользовательского события (например, открытия экрана ноутбука).
  3. Если мы проснулись из-за таймера rtc, немедленно выпустите команду «pm-hibernate», чтобы перейти в спящий режим.

Вот сценарий, который делает это , Назовите его 0000rtchibernate и поместите его в каталог /etc/pm/sleep.d (значение 0000 важно, так что скрипт выполняется сначала при приостановке и последний раз в возобновлении ).

  #! / bin / bash # Имя скрипта: /etc/pm/sleep.d/0000rtchibernate # Назначение: Авто спящий режим после периода сна # Отредактируйте переменную "autohibernate" ниже  для установки количества секунд для сна.  curtime = $ (date +% s) autohibernate = 7200 echo "$ curtime $ 1" & gt; /tmp/autohibernate.log, если ["$ 1" = "suspend"], затем # Suspending.  Запишите текущее время и установите таймер пробуждения.  echo «$ curtime» & gt; /var/run/pm-utils/locks/rtchibernate.lock rtcwake -m no -s $ authibernate fi if ["$ 1" = "resume"] then # Выход из сна sustime = $ (  cat /var/run/pm-utils/locks/rtchibernate.lock) rm /var/run/pm-utils/locks/rtchibernate.lock # Мы просыпались из-за таймера rtc выше?  if [$ (($ curtime - $ sustime)) -ge $ authibernate] then # Затем спящий rm /var/run/pm-utils/locks/pm-suspend.lock / usr / sbin / pm-hibernate else # В противном случае отмените  таймер rtc и просыпаться нормально.  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 .

33
ответ дан 6 August 2018 в 04:22

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

  1. После приостановки запишите текущее время и зарегистрируйте событие пробуждения, используя rtcwake.
  2. После возобновления проверьте текущее время относительно записанного времени сверху. Если прошло достаточно времени, мы, вероятно, проснулись из-за события таймера rtc. В противном случае мы рано проснулись из-за пользовательского события (например, открытия экрана ноутбука).
  3. Если мы проснулись из-за таймера rtc, немедленно выпустите команду «pm-hibernate», чтобы перейти в спящий режим.

Вот сценарий, который делает это , Назовите его 0000rtchibernate и поместите его в каталог /etc/pm/sleep.d (значение 0000 важно, так что скрипт выполняется сначала при приостановке и последний раз в возобновлении ).

  #! / bin / bash # Имя скрипта: /etc/pm/sleep.d/0000rtchibernate # Назначение: Авто спящий режим после периода сна # Отредактируйте переменную "autohibernate" ниже  для установки количества секунд для сна.  curtime = $ (date +% s) autohibernate = 7200 echo "$ curtime $ 1" & gt; /tmp/autohibernate.log, если ["$ 1" = "suspend"], затем # Suspending.  Запишите текущее время и установите таймер пробуждения.  echo «$ curtime» & gt; /var/run/pm-utils/locks/rtchibernate.lock rtcwake -m no -s $ authibernate fi if ["$ 1" = "resume"] then # Выход из сна sustime = $ (  cat /var/run/pm-utils/locks/rtchibernate.lock) rm /var/run/pm-utils/locks/rtchibernate.lock # Мы просыпались из-за таймера rtc выше?  if [$ (($ curtime - $ sustime)) -ge $ authibernate] then # Затем спящий rm /var/run/pm-utils/locks/pm-suspend.lock / usr / sbin / pm-hibernate else # В противном случае отмените  таймер rtc и просыпаться нормально.  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 .

33
ответ дан 7 August 2018 в 22:29

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

  1. После приостановки запишите текущее время и зарегистрируйте событие пробуждения, используя rtcwake.
  2. После возобновления проверьте текущее время относительно записанного времени сверху. Если прошло достаточно времени, мы, вероятно, проснулись из-за события таймера rtc. В противном случае мы рано проснулись из-за пользовательского события (например, открытия экрана ноутбука).
  3. Если мы проснулись из-за таймера rtc, немедленно выпустите команду «pm-hibernate», чтобы перейти в спящий режим.

Вот сценарий, который делает это , Назовите его 0000rtchibernate и поместите его в каталог /etc/pm/sleep.d (значение 0000 важно, так что скрипт выполняется сначала при приостановке и последний раз в возобновлении ).

  #! / bin / bash # Имя скрипта: /etc/pm/sleep.d/0000rtchibernate # Назначение: Авто спящий режим после периода сна # Отредактируйте переменную "autohibernate" ниже  для установки количества секунд для сна.  curtime = $ (date +% s) autohibernate = 7200 echo "$ curtime $ 1" & gt; /tmp/autohibernate.log, если ["$ 1" = "suspend"], затем # Suspending.  Запишите текущее время и установите таймер пробуждения.  echo «$ curtime» & gt; /var/run/pm-utils/locks/rtchibernate.lock rtcwake -m no -s $ authibernate fi if ["$ 1" = "resume"] then # Выход из сна sustime = $ (  cat /var/run/pm-utils/locks/rtchibernate.lock) rm /var/run/pm-utils/locks/rtchibernate.lock # Мы просыпались из-за таймера rtc выше?  if [$ (($ curtime - $ sustime)) -ge $ authibernate] then # Затем спящий rm /var/run/pm-utils/locks/pm-suspend.lock / usr / sbin / pm-hibernate else # В противном случае отмените  таймер rtc и просыпаться нормально.  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 .

33
ответ дан 10 August 2018 в 10:37

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

  1. После приостановки запишите текущее время и зарегистрируйте событие пробуждения, используя rtcwake.
  2. После возобновления проверьте текущее время относительно записанного времени сверху. Если прошло достаточно времени, мы, вероятно, проснулись из-за события таймера rtc. В противном случае мы рано проснулись из-за пользовательского события (например, открытия экрана ноутбука).
  3. Если мы проснулись из-за таймера rtc, немедленно выпустите команду «pm-hibernate», чтобы перейти в спящий режим.

Вот сценарий, который делает это , Назовите его 0000rtchibernate и поместите его в каталог /etc/pm/sleep.d (значение 0000 важно, так что скрипт выполняется сначала при приостановке и последний раз в возобновлении ).

  #! / bin / bash # Имя скрипта: /etc/pm/sleep.d/0000rtchibernate # Назначение: Авто спящий режим после периода сна # Отредактируйте переменную "autohibernate" ниже  для установки количества секунд для сна.  curtime = $ (date +% s) autohibernate = 7200 echo "$ curtime $ 1" & gt; /tmp/autohibernate.log, если ["$ 1" = "suspend"], затем # Suspending.  Запишите текущее время и установите таймер пробуждения.  echo «$ curtime» & gt; /var/run/pm-utils/locks/rtchibernate.lock rtcwake -m no -s $ authibernate fi if ["$ 1" = "resume"] then # Выход из сна sustime = $ (  cat /var/run/pm-utils/locks/rtchibernate.lock) rm /var/run/pm-utils/locks/rtchibernate.lock # Мы просыпались из-за таймера rtc выше?  if [$ (($ curtime - $ sustime)) -ge $ authibernate] then # Затем спящий rm /var/run/pm-utils/locks/pm-suspend.lock / usr / sbin / pm-hibernate else # В противном случае отмените  таймер rtc и просыпаться нормально.  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 .

33
ответ дан 13 August 2018 в 17:09
  • 1
    Он работал здесь, но только после того, как я chmoded файл, чтобы добавить X для всех. Я огромный новичок, и мне потребовалось 2 дня, чтобы понять. Очень хороший сценарий, и я надеюсь, что это поможет любому, у кого возникнут проблемы. Спасибо. – user 29 March 2012 в 22:27
  • 2
    Это сделает полезный пакет Ubuntu / Debian! – Petr Pudlák 10 December 2012 в 14:26
  • 3
    Просто интересно: будет ли это справедливо для Ubuntu 13.04? Мне нужно именно это решение, но я не хочу возиться с ноутбуком жены, если окажется, что он сломает вещи на более новых версиях. – Torben Gundtofte-Bruun 17 September 2013 в 11:33
  • 4
    Спасибо за скрипт. Работает отлично для меня на Ubuntu 14.04! Одно улучшение было бы, если когда ноутбук просыпается до спящего режима, он может проверить, подключен ли он к сети переменного тока. Если это так, я бы хотел, чтобы он снова приостанавливался вместо спячки. Восстановление из спящего режима занимает больше времени, и мне не нужно его спящий режим, когда он подключен ... – maddentim 6 June 2014 в 19:19
  • 5
    Огромное спасибо!!!! Этот сценарий - волшебство, о котором я мечтал !! – yanpas 10 August 2015 в 23:42

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

[Sleep]
HibernateDelaySec=3600

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

sudo systemctl suspend-then-hibernate

(вы можете отредактировать HibernateDelaySec, чтобы уменьшить задержку до спящего режима). Если все работает нормально, вы можете изменить действие Close Close, для этого вам нужно отредактировать файл /etc/systemd/logind.conf

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

sudo systemctl restart systemd-logind.service

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

2
ответ дан 9 October 2018 в 11:46

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

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

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

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

pm-is-supported --suspend-hybrid && echo "you're lucky"
12
ответ дан 26 May 2018 в 00:30
  • 1
    Единственный апостроф в вашей команде оболочки может вводить в заблуждение и запутывать ... пожалуйста, избегайте этого. – ayan4m1 11 November 2010 в 21:49
  • 2
    Bah, вот что происходит, когда вы редактируете командную строку, встроенную в другой текст, не думая об этом как о командной строке ... Спасибо и amp; Исправлена. – JanC 12 November 2010 в 07:44
  • 3
    Нет проблем, да, поняли о разных хардфелях для двух процессов. – ayan4m1 12 November 2010 в 09:40

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

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

s2both

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

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

6
ответ дан 26 May 2018 в 00:30

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

   ...
/usr/sbin/pm-hibernate || /usr/sbin/pm-suspend
   ...
4
ответ дан 26 May 2018 в 00:30

Ubuntu 16.04 - из suspend / sleep в спящий режим после заранее определенного времени

Кажется, что на Ubuntu 16.04 все немного отличается, поэтому шаги, которые я предпринял, чтобы заставить его работать, были: [!d1 ] Убедитесь, что hibernate работает как ожидалось при запуске

systemctl hibernate
Скопируйте исходный файл suspend.target:
sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
Затем отредактируйте файл /etc/systemd/system/suspend.target и добавьте строку:
Requires=delayed-hibernation.service
в раздел [Unit] этого файл. Создайте файл /etc/systemd/system/delayed-hibernation.service со следующим содержимым: [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 Убедитесь, что спящий режим работает как ожидалось при запуске
systemctl hibernate
# 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

Убедитесь, что hibernate работает, как ожидалось, при запуске

Создайте файл /usr/local/bin/delayed-hibernation.sh с содержимым:
#!/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

Убедитесь, что спящий режим работает как ожидается при запуске

Создайте файл /usr/local/bin/delayed-hibernation.sh с контентом:
chmod 755 /usr/local/bin/delayed-hibernation.sh

Создайте сценарий, который на самом деле сделает тяжелую работу.

Мне потребовалось довольно много до написания этого сценария на основе других ответов в этом потоке, которые я нашел в Интернете, например https://bbs.archlinux.org/viewtopic.php?pid=1554259

Создать файл [ f15] с содержимым:

sudo systemctl daemon-reload
sudo systemctl enable delayed-hibernation.service 
, чтобы убедиться, что используются новые службы / конфигурации.

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

sudo systemctl status delayed-hibernation.service

Окончательный шаг, я предполагаю, должен просто выполнить

sudo systemctl status delayed-hibernation.service

Чтобы проверить журнал обслуживания, вы можете использовать:

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:~$

или для полного журнала использования службы:

4
ответ дан 26 May 2018 в 00:30

Вот обновленная версия ответа Дерека Прессналла, который работает с 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
3
ответ дан 26 May 2018 в 00:30
  • 1
    Это работало отлично в течение нескольких месяцев в 15.10, но что-то около 16.04 предотвращает его спящий режим, хотя сценарий все еще работает. – Sean 23 April 2016 в 20:44
  • 2
    @Sean вы пробовали обходной путь в этой теме ? – Niccolò Maggioni 24 April 2016 в 14:00
  • 3
    Спасибо, что указал мне в правильном направлении. Я создал службу Systemd (/etc/systemd/system/delayed-hibernation.service), который ссылается сценарием выше, то модифицированный /etc/systemd/system/suspend.target требовать отсроченного hibernation.service. – Sean 25 April 2016 в 01:02

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

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

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.

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

2
ответ дан 26 May 2018 в 00:30

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

systemctl hybrid-sleep

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

ps: Я знаю, что это не совсем то, что выложили OP, но это довольно близко [!d2 ]

1
ответ дан 26 May 2018 в 00:30

Не забудьте 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 и выполняется спящий режим (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
ответ дан 26 May 2018 в 00:30

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

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

s2both

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

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

6
ответ дан 25 July 2018 в 22:54

Вот обновленная версия ответа Дерека Прессналла, который работает с 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
3
ответ дан 25 July 2018 в 22:54
  • 1
    Это работало отлично в течение нескольких месяцев в 15.10, но что-то около 16.04 предотвращает его спящий режим, хотя сценарий все еще работает. – Sean 23 April 2016 в 20:44
  • 2
    @Sean вы пробовали обходной путь в этой теме ? – Niccolò Maggioni 24 April 2016 в 14:00
  • 3
    Спасибо, что указал мне в правильном направлении. Я создал службу systemd (/etc/systemd/system/delayed-hibernation.service), которая ссылалась на сценарий выше, а затем модифицировала /etc/systemd/system/suspend.target, чтобы потребовать delay-hibernation.service. – Sean 25 April 2016 в 01:02

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

... /usr/sbin/pm-hibernate || /usr/sbin/pm-suspend ...
4
ответ дан 25 July 2018 в 22:54

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

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

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

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

pm-is-supported --suspend-hybrid && echo "you're lucky"
12
ответ дан 25 July 2018 в 22:54
  • 1
    Единственный апостроф в вашей команде оболочки может вводить в заблуждение и запутывать ... пожалуйста, избегайте этого. – ayan4m1 11 November 2010 в 21:49
  • 2
    Bah, вот что происходит, когда вы редактируете командную строку, встроенную в другой текст, не думая об этом как о командной строке ... Спасибо и amp; Исправлена. – JanC 12 November 2010 в 07:44
  • 3
    Нет проблем, да, поняли о разных хардфелях для двух процессов. – ayan4m1 12 November 2010 в 09:40

Ubuntu 16.04 - из suspend / sleep в спящий режим после заранее определенного времени

Кажется, что на Ubuntu 16.04 все немного отличается, поэтому шаги, которые я предпринял, чтобы заставить его работать, были:

Убедитесь, что hibernate работает как ожидалось при запуске systemctl hibernate Скопируйте исходный файл suspend.target: sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target Затем отредактируйте файл /etc/systemd/system/suspend.target и добавьте строку: Requires=delayed-hibernation.service в раздел [Unit] этого файл. Создайте файл /etc/systemd/system/delayed-hibernation.service со следующим содержимым: [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 Убедитесь, что спящий режим работает, как ожидалось, при запуске systemctl hibernate # 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

Убедитесь, что hibernate работает, как ожидалось, при запуске

Создайте файл /usr/local/bin/delayed-hibernation.sh с содержимым:
#!/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

Убедитесь, что спящий режим работает как ожидается при запуске

Создайте файл /usr/local/bin/delayed-hibernation.sh с контентом:
chmod 755 /usr/local/bin/delayed-hibernation.sh

Создайте сценарий, который на самом деле сделает тяжелую работу.

Мне потребовалось довольно много до написания этого сценария на основе других ответов в этом потоке, которые я нашел в Интернете, например https://bbs.archlinux.org/viewtopic.php?pid=1554259

Создать файл /usr/local/bin/delayed-hibernation.sh с содержимым:

sudo systemctl daemon-reload sudo systemctl enable delayed-hibernation.service , чтобы убедиться, что используются новые службы / конфигурации.

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

sudo systemctl status delayed-hibernation.service

Окончательный шаг, я предполагаю, должен просто выполнить

sudo systemctl status delayed-hibernation.service

Чтобы проверить журнал обслуживания, вы можете использовать:

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:~$

или для полного журнала использования службы:

5
ответ дан 25 July 2018 в 22:54
  • 1
    Спасибо за ответ, это все еще работает как прелесть Ubuntu 18.04. Я не мог заставить вышеупомянутые ответы работать, выполнение /bin/systemctl hibernate всегда будет возвращать 1 при запуске в сценарии systemd, хотя он отлично работает в командной строке. – eugenhu 28 May 2018 в 09:21

Не забудьте 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 и выполняется спящий режим (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
ответ дан 25 July 2018 в 22:54

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

systemctl hybrid-sleep

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

ps: Я знаю, что это не совсем то, что выложили OP, но это довольно близко

1
ответ дан 25 July 2018 в 22:54

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

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

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.

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

2
ответ дан 25 July 2018 в 22:54

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

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

s2both

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

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

6
ответ дан 2 August 2018 в 04:18

Вот обновленная версия ответа Дерека Прессналла, который работает с 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
3
ответ дан 2 August 2018 в 04:18
  • 1
    Это работало отлично в течение нескольких месяцев в 15.10, но что-то около 16.04 предотвращает его спящий режим, хотя сценарий все еще работает. – Sean 23 April 2016 в 20:44
  • 2
    @Sean вы пробовали обходной путь в этой теме ? – Niccolò Maggioni 24 April 2016 в 14:00
  • 3
    Спасибо, что указал мне в правильном направлении. Я создал службу systemd (/etc/systemd/system/delayed-hibernation.service), которая ссылалась на сценарий выше, а затем модифицировала /etc/systemd/system/suspend.target, чтобы потребовать delay-hibernation.service. – Sean 25 April 2016 в 01:02

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

... /usr/sbin/pm-hibernate || /usr/sbin/pm-suspend ...
4
ответ дан 2 August 2018 в 04:18

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

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

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

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

pm-is-supported --suspend-hybrid && echo "you're lucky"
12
ответ дан 2 August 2018 в 04:18
  • 1
    Единственный апостроф в вашей команде оболочки может вводить в заблуждение и запутывать ... пожалуйста, избегайте этого. – ayan4m1 11 November 2010 в 21:49
  • 2
    Bah, вот что происходит, когда вы редактируете командную строку, встроенную в другой текст, не думая об этом как о командной строке ... Спасибо и amp; Исправлена. – JanC 12 November 2010 в 07:44
  • 3
    Нет проблем, да, поняли о разных хардфелях для двух процессов. – ayan4m1 12 November 2010 в 09:40

Ubuntu 16.04 - из suspend / sleep в спящий режим после заранее определенного времени

Кажется, что на Ubuntu 16.04 все немного отличается, поэтому шаги, которые я предпринял, чтобы заставить его работать, были:

Убедитесь, что hibernate работает как ожидалось при запуске systemctl hibernate Скопируйте исходный файл suspend.target: sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target Затем отредактируйте файл /etc/systemd/system/suspend.target и добавьте строку: Requires=delayed-hibernation.service в раздел [Unit] этого файл. Создайте файл /etc/systemd/system/delayed-hibernation.service со следующим содержимым: [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 Убедитесь, что спящий режим работает как ожидалось при запуске systemctl hibernate # 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

Убедитесь, что hibernate работает, как ожидалось, при запуске

Создайте файл /usr/local/bin/delayed-hibernation.sh с содержимым:
#!/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

Убедитесь, что спящий режим работает как ожидается при запуске

Создайте файл /usr/local/bin/delayed-hibernation.sh с контентом:
chmod 755 /usr/local/bin/delayed-hibernation.sh

Создайте сценарий, который на самом деле сделает тяжелую работу.

Мне потребовалось довольно много до написания этого сценария на основе других ответов в этом потоке, которые я нашел в Интернете, например https://bbs.archlinux.org/viewtopic.php?pid=1554259

Создать файл /usr/local/bin/delayed-hibernation.sh с содержимым:

sudo systemctl daemon-reload sudo systemctl enable delayed-hibernation.service , чтобы убедиться, что используются новые службы / конфигурации.

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

sudo systemctl status delayed-hibernation.service

Окончательный шаг, я предполагаю, должен просто выполнить

sudo systemctl status delayed-hibernation.service

Чтобы проверить журнал обслуживания, вы можете использовать:

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:~$

или для полного журнала использования службы:

5
ответ дан 2 August 2018 в 04:18
  • 1
    Спасибо за ответ, это все еще работает как прелесть Ubuntu 18.04. Я не мог заставить вышеупомянутые ответы работать, выполнение /bin/systemctl hibernate всегда будет возвращать 1 при запуске в сценарии systemd, хотя он отлично работает в командной строке. – eugenhu 28 May 2018 в 09:21

Не забудьте 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 и выполняется спящий режим (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
ответ дан 2 August 2018 в 04:18

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

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