web-dev-qa-db-ja.com

SuspendからHibernateに自動的に移動する方法は?

Ubuntuをサスペンド、別名「サスペンド鎮静」からHibernate状態にすることは可能ですか?

私が探しているのはこれです:
蓋を閉じると、ラップトップはサスペンド状態になります。その後、事前に決められた時間(バッテリーが強くなっても)を使用しない場合は、バッテリーを節約するために休止状態になります。

たとえば、蓋を閉じると、ラップトップはサスペンドに入るように設定されています。その後、1日中使用しないと、バッテリーが消耗します。これは、サスペンドモードでもハードウェアが少量の電力を消費し、最終的にバッテリーが放電するためです。私が望んでいるのは、Ubuntuが中断されていても、数時間の非アクティブ状態が続いた後でもHibernateに入る必要があることをUbuntuに伝えることができるようにすることです。

Windowsはそれを行うことができます。 Ubuntuは、スタンバイになるようにプログラムできますまたはタイマーで休止状態になりますが、両方にはなりません。

51
Sergey Stadnik

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

それで全部です!これで、このNice関数を使用できます。

16
PRIHLOP

これに対する解決策は簡単です。まず、サスペンドおよびレジューム時に、pm-suspendプログラムは/etc/pm/sleep.dおよび/usr/lib/pm-utils/sleep.dの一連のスクリプトを実行します。したがって、私の解決策は、次のことを行うスクリプトを追加することです。

  1. 中断したら、現在の時刻を記録し、rtcwakeを使用してウェイクアップイベントを登録します。
  2. 再開したら、現在の時刻を上から記録された時刻と照合します。十分な時間が経過した場合は、おそらくrtcタイマーイベントにより目が覚めました。それ以外の場合、ユーザーイベント(ラップトップ画面を開くなど)が原因で早起きしました。
  3. Rtcタイマーが原因で目覚めた場合は、すぐに「pm-hibernate」コマンドを発行して休止状態に入ります。

これを行うスクリプトを次に示します。 0000rtchibernateという名前を付けて/etc/pm/sleep.dディレクトリに配置します(0000は重要なので、スクリプトは一時停止時に最初に実行され、最後に再開時に実行されます)。

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

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

うまくいけば、このコードがこの伝言板に掲載されることを願っています(これが私の最初の投稿です).

タイムアウト値autohibernate=7200を編集します。ただし、休止状態に入る前に何秒スリープするかを設定します。上記の現在の値は2時間です。ラップトップは休止状態機能を実行している間、数秒間その時点で起動します。

そのため、ラップトップをケースに入れる予定がある場合は、中断せずに休止状態にしてください。そうしないと、ラップトップが特に過熱するおそれがあります。ぴったり合ったスリップケースにある場合(ただし、数秒から1分間だけオンになります)。

私は過去数日間この方法を使用してきましたが、これまでのところ成功しています(そして今日の午後にバッテリー切れから救われました)。楽しい。

systemd以降のUbuntuバージョンを使用する他のLinuxディストリビューションでは、/usr/lib/systemd/system-sleepの代わりに/etc/pm/sleep.dにスクリプトを配置しても、これが機能するはずです。また、/usr/sbin/pm-hibernateコマンドをsystemctl hibernateに置き換えます。

35
Derek Pressnall

これがどのように機能するかを説明するために(これはWindowsに似ています)簡単な言葉で:バッテリーが低下してもマシンがスタンバイ状態からウェイクアップせず、マシンの状態をスワップパーティションに保存できるため、すべてをすぐにスワップパーティションに保存しますスタンバイ状態で、バッテリーがなくなると、スワップパーティションから状態を読み込むことで回復します(休止状態の場合のように)。

AFAIK Linuxは、ハードウェアで機能することがわかっている場合、「通常の」スタンバイの代わりにハイブリッドスタンバイ/休止状態を使用します。あまりにも多くのバグや何かが原因で現在無効になっている可能性もあります...;)

実験が好きなら、多分あなたは pm-suspend-hybrid で良い結果を得ることができるかどうかを見ることができます。

以下が幸運だと言っている場合、理論的にはシステムでハイブリッドサスペンドがサポートされています。

pm-is-supported --suspend-hybrid && echo "you're lucky"
12
JanC

s2both に興味があるかもしれません。これは、Ubuntu 10.10のパッケージuswsuspで提供されます。ディスクにサスペンドしますが、システムをシャットダウンする代わりに、S3に入れます。これは通常、Ubuntuの「サスペンド」オプションに関連付けられている電源モードです。 pm-suspend-hybrid は、同じことを目的とする別のツールです。

ふたを閉じるときにこれを自動化するには、ふたイベントがキャッチされたときに任意のスクリプトを実行できる次のガイドを参照してください。

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

たまたまThinkPadを持っている場合、tpctlのマンページは引数--pm-sedation-hibernate-from-suspend-timerを参照します。これは、探している機能を提供しているようです。私は、ThinkPad以外のハードウェアでこれを試すことに対して警告します。

参考のために、 hibernate.conf ;のマンページを調べました。関連するオプションはないようですが、一読する価値があるかもしれません。

6
ayan4m1

Ubuntu 16.04-所定の時間が経過するとサスペンド/スリープから休止状態になります

Ubuntu 16.04では状況が少し異なるようです。そのため、私がそれを機能させるために行った手順は次のとおりです。

  1. 実行時に休止状態が期待どおりに機能していることを確認します

    systemctl hibernate
    
  2. 元のsuspend.targetファイルをコピーします。

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

    次に、ファイル/etc/systemd/system/suspend.targetを編集し、次の行を追加します。

    Requires=delayed-hibernation.service
    

    そのファイルの[Unit]セクションに。

  3. 次の内容のファイル/etc/systemd/system/delayed-hibernation.serviceを作成します。

 [単位] 
説明=遅延休止トリガー
 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. 次のコンテンツを使用して、スクリプトの構成ファイル/etc/delayed-hibernation.confを作成します。
# 'delayed-hibernation.sh'スクリプトの構成ファイル
 
#コンピューターが休止状態になるまでスリープモードで過ごす時間を秒単位で指定します
 TIMEOUT = 1200 #秒で、20分を与えます
  1. 実際にハードワークを行うスクリプトを作成します。

    コンテンツを含むファイル/usr/local/bin/delayed-hibernation.shを作成します。

#!/ bin/bash 
#スクリプト名:delay-hibernation.sh 
#目的:一定期間のスリープ後の自動休止
#「タイムアウト」を編集`スリープする秒数を設定するための` $ hibernation_conf`ファイルの変数。
 
 hibernation_lock = '/ var/run/delayed-hibernation.lock' 
 hibernation_fail = ' /var/run/delayed-hibernation.fail'
hibernation_conf='/etc/delayed-hibernation.conf'

#設定ファイルの確認
 if [ ! -f $ hibernation_conf]; then 
 echo "設定ファイル( '$ hibernation_conf')がありません、中止します。" 
 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 "設定ファイル( '$ hibernation_conf')から 'TIMEOUT'パラメータが欠落しています。中止します。" 
 exit 1 
 Elif [[!! "$ hibernation_timeout" =〜^ [0-9] + $]]; then 
 echo "設定ファイル( '$ hibernation_conf')の不正な 'TIMEOUT'パラメーター( '$ hibernation_timeout')、予想される秒数、中止。" 
 exit 1 
 fi 
 
#指定されたパラメーターの処理
 if ["$ 2" = "suspend"]; then 
 curtime = $(date +%s)
 if ["$ 1" = "pre"]; then 
 if [-f $ hibernation_fail]; then 
 echo "ハイバネーションの失敗を検出、設定RTCウェイクアップタイマーをスキップします。" 
 else 
 echo "サスペンドを検出しました。記録時間、設定RTCtimer "
 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 "サスペンドからの自動再開が検出されました。休止状態..." 
 systemctl hibernate 
 if [$? -ne 0]; then 
 echo "自動ハイバネーションに失敗しました。代わりにサスペンドしようとしています。" 
 touch $ hibernation_fail 
 systemctl suspend 
 if [$? -ne 0]; then 
 echo "自動ハイバネーションとフェイルオーバーのサスペンドに失敗しました。他に試すことはありません。" 
 fi 
 fi 
 else 
 echo "サスペンドからの手動再開クリアRTCtimer "
 rtcwake -m disable 
 fi 
 else 
 echo"ファイル '$ hibernation_lock'が見つかりませんでした。 "
 fi 
 else 
 echo"認識されない最初のパラメーター: '$ 1'、予期される 'pre'または 'post' "
 fi 
 else 
 echo "このスクリプトは、systemctl delay-hibernation.service(予想される2番目のパラメーター: 'suspend')によって実行されることを意図しています。" 
 fi 
  1. スクリプトを実行可能にします。
 chmod 755 /usr/local/bin/delayed-hibernation.sh

このスレッドの他の返信に基づいてこのスクリプトを書くまでにかなりの時間がかかりました。インターネット上で見つけたものは https://bbs.archlinux.org/viewtopic.php?pid=1554259

私のバージョンのスクリプトは、休止状態が成功しなかった場合に再びサスペンド状態になるなど、多くの問題に対処しようとしますが、所定の時間が経過しても再び起動しないようにします。

  1. 最後のステップは、ただ実行することだと思います

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

    新しいサービス/構成が使用されていることを確認します。

サービスログを確認するには、次を使用できます。

Sudo systemctl status delayed-hibernation.service

またはサービス使用の完全なログの場合:

Sudo journalctl -u delay-hibernation.service

実行中のサービスから取得する通常のログは次のとおりです。

 mile @ mile-ThinkPad:〜$ Sudo systemctl status delayed-hibernation.service 
●delayed-hibernation.service-休止状態の遅延トリガー
 Loaded:loaded(/ etc/systemd/system/delayed-hibernation.service; enabled; vendor preset:enabled)
 Active:inactive(dead)
 
 Jun 09 20:35:42 mile-ThinkPad systemd [1] :遅延休止トリガーを開始しています... 
 Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh [2933]:中断が検出されました。録画時間、設定RTCtimer 
 Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh [2933]:rtcwake:想定RTCUTCを使用.. 。
 Jun 09 20:35:42 mile-ThinkPad delay-hibernation.sh [2933]:rtcwake:/ dev/rtc0を使用したThu Jun 9 18:55:43 2016 
 Jun 09でのウェイクアップ20:55:44 mile-ThinkPad systemd [1]:遅延休止トリガーを開始しました。
 Jun 09 20:55:44 mile-ThinkPad systemd [1]:delay-hibernation.service:ユニットはもう必要ありません。 
 Jun 09 20:55:44 mile-ThinkPad systemd [1]:遅延休止状態トリガーの停止... 
 Jun 09 20:55:44 mile-ThinkPad delay-hibernation.sh [ 3093]:サスペンドからの自動再開が検出されました。休止中... 
 Jun 09 20:55:44 mile-ThinkPad systemd [1]:休止状態の遅延休止トリガー。
 mile @ mile-ThinkPad:〜$ 

だから、これはそれだろう、私はこの便利な機能を動作させるために構成とスクリプトバージョンの正しい組み合わせを見つけようとして何日も費やしていたので、それが本当に誰かを助けることを願っています。

5
mihai.ile

pm-hibernateの間に何か問題が発生した場合に備えて、コンピュータを実行させるよりもサスペンド状態にしたいです。以下を使用できます。

   ...
/usr/sbin/pm-hibernate || /usr/sbin/pm-suspend
   ...
4
iiegn

Derek Pressnallの答え の更新版であり、systemdで動作し、 Eliah Kaganの提案 を含み、/ 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つのノートブック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

私はノートブックの1つで問題に直面しました:ふたを閉じてもこのターゲットはトリガーされませんでした。これはxfce4-power-managerが原因でした。この問題を回避するには2つの方法があります。最初の方法は、/etc/systemd/logind.confファイルを編集し、HandleLidSwitch=ignoreHandleLidSwitch=suspendに置き換えることです。ただし、システム全体に適用されるため、スクリプトにシンボリックリンクを追加しました# ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate

2
yanpas

別のより一般的な回避策として、hybrid-sleepを使用できます(Mac OSと同様)。コンピューターが休止状態をサポートしている場合、この機能を使用できます。

systemctl hybrid-sleep

そのコマンドは、コンピューターを中断し、ディスクに送信(休止状態)する必要があります。しばらくすると、コンピューターの電源が切れます(電源を入れると、休止状態ファイルを使用して起動します)。

p.s .: OPが投稿したものとは正確には一致しませんが、かなり近い

1
morhook

そのファイルをchmod + xすることを忘れずに、実行可能にしてください。

/ sys/class/rtc/rtc0のwakealarmを使用して、rtcwakeを使用しない別のソリューションがあります。カーネルが直接サポートしていないので、コメントの後にpm-functions(/ usr/lib/pm-utils)で廃止されたコードを使用します...((現在のカーネル(3.6以降)は直接サポートします)。そのコードを元に戻し、do_suspend_hybrid()の代わりにdo_suspend()部分に入れます。

廃止されたコード(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)。復帰したコードをuswsuspモジュールのdo_suspend()部分(/usr/lib/pm-utils/module.d)に配置します。

元に戻されたコード(サスペンドが呼び出されたときのsuspend_hybrid):

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を使用しないと、特にwakealarmがトリガーされて休止状態(uswsuspのs2disk)を実行する場合に、サスペンド/休止状態がうっとうしく表示されます。休止状態になる前のスリープ期間をpm-functionsファイルの通常の場所に設定します。

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

Uswsusp modは次のとおりです(このモジュールはpm-functionsから呼び出されるため、挿入される変数は同じです)。

#!/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
mark