Comment passer automatiquement de Suspend à Hibernate?

43

Est-il possible de faire passer Ubuntu à l’état Hibernate à partir de Suspend, alias "Suspend Sedation"?

Par exemple, mon ordinateur portable est configuré pour entrer en suspension une fois que je ferme le couvercle. Si je ne l'utilise pas pendant toute la journée, la batterie se met à plat, car même en mode veille, le matériel consomme encore une petite quantité d'énergie et la batterie finit par se décharger. Ce que je veux, c'est pouvoir dire à Ubuntu que même s'il est suspendu, il doit encore passer en Hibernate après quelques heures d'inactivité.

Windows peut le faire. Ubuntu peut être programmé pour passer en veille ou en veille prolongée, mais pas les deux.

Mise à jour:

Je suppose que je dois être plus précis. Ce que je cherche c'est ceci:
Lorsque je ferme le couvercle, l'ordinateur portable est mis en suspension. Ensuite, après un temps prédéterminé (même si la batterie est puissante) si je ne l’utilise toujours pas, il doit se mettre en veille prolongée pour économiser la batterie.

    
posée Sergey Stadnik 10.11.2010 - 01:39
la source

9 réponses

33

La solution à ce problème est simple. Tout d'abord, lors de la suspension et de la reprise, le programme pm-suspend exécute une série de scripts dans /etc/pm/sleep.d et /usr/lib/pm-utils/sleep.d . Donc, ma solution consiste à ajouter un script qui effectue les opérations suivantes:

  1. Lors de la suspension, enregistrez l'heure actuelle et enregistrez un événement de réveil à l'aide de rtcwake.
  2. À la reprise, vérifiez l’heure actuelle par rapport à l’heure enregistrée ci-dessus. Si suffisamment de temps s'est écoulé, nous nous sommes probablement réveillés en raison de l'événement de temporisation rtc. Sinon, nous nous sommes réveillés tôt en raison d'un événement utilisateur (tel que l'ouverture de l'écran de l'ordinateur portable).
  3. Si nous nous sommes réveillés à cause du minuteur rtc, alors lancez immédiatement une commande "pm-hibernate" pour passer en veille prolongée.

Voici un script qui fait cela. Nommez-le 0000rtchibernate et placez-le dans le répertoire /etc/pm/sleep.d (le 0000 est important, de sorte que le script s'exécute d'abord lors de la suspension, et le dernier à la reprise).

#!/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 " >>/tmp/autohibernate.log
if [ "" = "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 [ "" = "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

J'espère que ce code sera diffusé sur ce forum (voici mon premier message ici).

Modifiez la valeur du délai d’expiration autohibernate=7200 en haut de la liste, en secondes, avant de passer en veille prolongée. La valeur actuelle ci-dessus est 2 heures. Notez que votre ordinateur portable se réveillera à ce moment pendant quelques secondes, pendant qu'il exécute la fonction de mise en veille prolongée.

Donc, si vous prévoyez de mettre votre ordinateur portable dans une affaire, ne le suspendez pas, mais restez en veille prolongée. Sinon, votre ordinateur portable pourrait surchauffer en esp. si c'est dans un étui bien ajusté (bien que cela ne dure que quelques secondes à une minute).

J'utilise cette méthode depuis quelques jours, jusqu'à présent, elle a réussi (et m'a sauvé d'une batterie morte cet après-midi). Profitez.

Pour les autres distributions Linux utilisant les versions systemd et Ubuntu plus récentes, cela devrait toujours fonctionner si vous placez le script dans /usr/lib/systemd/system-sleep au lieu de /etc/pm/sleep.d . Remplacez également la commande /usr/sbin/pm-hibernate par systemctl hibernate .

    
réponse donnée Derek Pressnall 02.04.2011 - 23:16
la source
12

Pour expliquer comment cela fonctionne (ceci est similaire à Windows) en termes simples: la machine ne se réveille pas en mode veille lorsque la batterie est faible pour pouvoir enregistrer l'état de la machine sur la partition swap, échangez la partition immédiatement en mode veille et, lorsque la batterie est épuisée, elle se remettra en place en chargeant l’état de la partition de swap (comme elle le ferait au cas où vous hiberneriez).

AFAIK linux doit / devrait utiliser le mode veille / veille prolongée hybride au lieu du mode veille "normal" s'il sait que cela fonctionne pour votre matériel. Il est également possible que ceci soit désactivé actuellement à cause de trop de bogues ou de quelque chose ...;)

Si vous aimez expérimenter, vous pouvez peut-être voir si vous pouvez obtenir de bons résultats avec pm-suspend-hybrid .

Si ce qui suit vous dit que vous avez de la chance, alors en théorie, la suspension hybride est prise en charge sur votre système:

pm-is-supported --suspend-hybrid && echo "you're lucky"
    
réponse donnée JanC 10.11.2010 - 02:14
la source
6

Vous pouvez être intéressé par s2both . Il est fourni par le package uswsusp dans Ubuntu 10.10. Il est suspendu sur le disque, mais au lieu de le fermer, il le place dans S3, qui est le mode d'alimentation généralement associé à l'option "Suspendre" dans Ubuntu. pm-suspend-hybrid est un autre outil censé faire la même chose chose.

Pour automatiser cette opération, consultez le guide suivant qui vous permet d’exécuter un script arbitraire lorsqu’un événement est détecté:

lien

Si vous avez un ThinkPad, la page de manuel de tpctl fait référence à un argument, --pm-sedation-hibernate-from-suspend-timer , qui semble fournir la fonctionnalité que vous recherchez. Je vous déconseille d'essayer cela sur du matériel autre que ThinkPad.

Pour référence, j'ai consulté la page de manuel relative à hibernate.conf . il ne semblait pas y avoir d’options pertinentes, mais cela mériterait peut-être une deuxième lecture.

    
réponse donnée ayan4m1 10.11.2010 - 02:21
la source
5

Ubuntu 16.04 - de suspendre / dormir en veille prolongée après une heure prédéterminée

Il semble que sur Ubuntu 16.04 les choses soient un peu différentes, donc les mesures que j'ai prises pour y arriver étaient les suivantes:

  1. Assurez-vous que Hibernate fonctionne comme prévu lors de l'exécution

    systemctl hibernate
    
  2. Copiez le fichier suspend.target d'origine:

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

    Puis éditez le fichier /etc/systemd/system/suspend.target et ajoutez la ligne:

    Requires=delayed-hibernation.service
    

    à la section [Unit] de ce fichier.

  3. Créez le fichier /etc/systemd/system/delayed-hibernation.service avec le contenu suivant:

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

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

[Install]
WantedBy=sleep.target
  1. Créez le fichier de configuration /etc/delayed-hibernation.conf pour le script avec le contenu suivant:
# Configuration file for 'delayed-hibernation.sh' script

# Specify the time in seconds to spend in sleep mode before the computer hibernates
TIMEOUT=1200  #in seconds, gives 20 minutes
  1. Créez le script qui fera réellement le travail difficile.

    Créez le fichier /usr/local/bin/delayed-hibernation.sh avec le contenu:

#!/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  }' | awk -F'#' '{print }' | 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 [ "" = "suspend" ]; then
    curtime=$(date +%s)
    if [ "" = "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 [ "" = "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: '', expected 'pre' or 'post'"
    fi
else
    echo "This script is intended to be run by systemctl delayed-hibernation.service (expected second parameter: 'suspend')"
fi
  1. Rendre le script exécutable:
chmod 755 /usr/local/bin/delayed-hibernation.sh

Il m'a fallu pas mal de temps avant d’écrire ce script basé sur d’autres réponses dans ce fil, des choses que j’ai trouvées sur Internet comme lien

Ma version du script essaie de gérer de nombreux problèmes, comme la remise en veille si la mise en veille prolongée a échoué, mais ne se relance pas après une heure prédéterminée.

  1. Je suppose que la dernière étape consisterait simplement à exécuter

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

    pour vous assurer que de nouveaux services / configurations sont utilisés.

Pour vérifier le journal du service, vous pouvez utiliser:

  

sudo systemctl status retard-hibernation.service

ou pour un journal complet de l'utilisation du service:

  

sudo journalctl -u delay-hibernation.service

Un journal normal du service en cours d'exécution est:

[email protected]:~$ 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.
[email protected]:~$ 

Ce serait bien ça, j'espère que cela aide vraiment quelqu'un depuis que j'ai passé des jours à essayer de trouver la bonne combinaison de configurations et de versions de script pour faire fonctionner cette fonctionnalité pratique.

    
réponse donnée mihai.ile 10.06.2016 - 19:41
la source
4

Juste au cas où quelque chose irait mal pendant pm-hibernate , je mettrais plutôt l'ordinateur en veille que de le laisser fonctionner. Vous pouvez donc utiliser:

   ...
/usr/sbin/pm-hibernate || /usr/sbin/pm-suspend
   ...
    
réponse donnée iiegn 28.02.2013 - 22:24
la source
3

Voici une version mise à jour de la réponse de Derek Pressnall qui fonctionne avec systemd et inclut La suggestion d'Eliah Kagan , déposez-la simplement dans /usr/lib/systemd/system-sleep/delayed_hibernation.sh et rendez-la exécutable:

#!/bin/bash

hibernation_timeout=1800  #30 minutes

if [ "" = "suspend" ]; then
    curtime=$(date +%s)
    if [ "" = "pre" ]; then
        echo -e "[($curtime) [email protected]]\nExecuting pre-suspend hook..." >> /tmp/delayed_hibernation.log
        echo "$curtime" > /var/run/delayed_hibernation.lock
        rtcwake -m no -s $hibernation_timeout
    elif [ "" = "post" ]; then
        echo -e "[($curtime) [email protected]]\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
    
réponse donnée Niccolò Maggioni 17.08.2015 - 23:13
la source
2

Voici ma recette (testée sur deux ordinateurs portables Ubuntu 16.04):

Mettez ce script où vous voulez (je le place en root, /syspend.sh ) et rendez-le exécutable ( 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 [[  == "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 [[  == "suspend" ]]
then
    echo "$(date +%s)" >> $TIMELOG
    rtcwake -m no -s $SLEEPTIME
fi

Créez ensuite la cible systemd: # touch /etc/systemd/system/suspend-to-sleep.target Collez ce contenu:

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

Activez ensuite # systemctl enable suspend-to-sleep.target .

J'ai rencontré un problème sur l'un des cahiers: la fermeture du couvercle n'a pas déclenché cette cible. Cela était dû à xfce4-power-manager. Il existe deux manières de contourner ce problème. Le premier consiste à éditer /etc/systemd/logind.conf file et à remplacer HandleLidSwitch=ignore par HandleLidSwitch=suspend . Mais ce sera à l’échelle du système, alors je viens d’ajouter un lien symbolique à mon script # ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate

    
réponse donnée yanpas 04.10.2016 - 21:39
la source
1

Une autre solution plus courante consiste à utiliser hybrid-sleep (comme le fait Mac OS). Si votre ordinateur prend en charge l'hibernation, vous pouvez utiliser cette fonctionnalité:

systemctl hybrid-sleep

Cette commande devrait suspendre et envoyer sur disque (veille prolongée) l’ordinateur. Après un certain temps, l'ordinateur s'éteindra (à l'allumage, il utilisera les fichiers d'hibernation pour se réveiller).

p.s .: Je sais que ce n’est pas exactement ce que l’OP a affiché, mais il est assez proche

    
réponse donnée morhook 10.07.2017 - 12:58
la source
0

N'oubliez pas de chmod + x ce fichier, rendez-le exécutable.

Il existe une autre solution sans rtcwake, utilisant wakealarm dans / sys / class / rtc / rtc0. Utilisez le code obsolète dans les fonctions pm (/ usr / lib / pm-utils) après les commentaires # depuis que le noyau ne supporte pas directement ..., ('parce que le noyau actuel (après quelque chose 3.6) supporte directement). Rétablissez ce code et placez-le dans la partie do_suspend () au lieu de do_suspend_hybrid ().

Code obsolète (suspendre puis mettre en veille lorsque on appelle 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

Recommandé. Encore plus facile d’utiliser uswsusp tout en maximisant le bénéfice de s2both, c.-à-d. Placez le code retourné dans la partie do_suspend () du module uswsusp (/usr/lib/pm-utils/module.d).

Code inversé (suspend_hybrid lorsque la suspension est appelée):

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      

Avec uswsusp, nous pouvons voir la progression de la suspension / mise en veille prolongée et le processus inverse affiché dans le texte, même si nous pouvons l’abandonner en appuyant sur la touche Retour arrière. Sans uswsusp, suspend / hibernate apparaît-disparaît, surtout lorsque wakealarm est déclenché et exécute hibernate (s2disk dans uswsusp). Définissez la période de veille avant l’hibernation à l’endroit habituel dans le fichier de fonctions pm.

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

Voici le mod uswsusp: (rappelez-vous, ce module est appelé depuis les fonctions pm donc les variables insérées sont les mêmes)

#!/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  
    
réponse donnée mark 31.10.2013 - 14:04
la source

Lire d'autres questions sur les étiquettes