La solution à ce problème est simple. D'abord, lors de la suspension et de la reprise, le programme pm-suspend exécute une série de scripts en /etc/pm/sleep.d
y /usr/lib/pm-utils/sleep.d
. Ma solution est donc d'ajouter un script qui fait ce qui suit :
-
Lors de la suspension, enregistrez l'heure actuelle et enregistrez un événement de réveil en utilisant rtcwake.
-
Au moment de la reprise, vérifiez l'heure actuelle par rapport à l'heure enregistrée ci-dessus. Si suffisamment de temps s'est écoulé, alors nous nous sommes probablement réveillés à cause de l'événement du minuteur rtc. Sinon, nous nous sommes réveillés tôt en raison d'un événement utilisateur (comme l'ouverture de l'écran de l'ordinateur portable).
-
Si nous nous sommes réveillés à cause de la minuterie rtc, alors émettez immédiatement une commande "pm-hibernate" pour entrer en hibernation.
Voici un script qui fait cela. Nommez-le 0000rtchibernate
et le placer dans le /etc/pm/sleep.d
(le 0000 est important, afin que le script s'exécute en premier lors de la suspension, et en dernier lors de 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 $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
J'espère que ce code se retrouvera sur ce forum (c'est mon premier message ici).
Modifier la valeur du délai d'attente autohibernate=7200
en haut, jusqu'au nombre de secondes que vous avez choisi pour dormir avant de passer en hibernation. La valeur actuelle ci-dessus est de 2 heures. Notez que votre ordinateur portable se réveillera à ce moment-là pendant quelques secondes, pendant qu'il exécute la fonction d'hibernation.
Donc, si vous prévoyez de mettre votre ordinateur portable dans une mallette, ne le suspendez pas, mais mettez-le en veille prolongée. Sinon, votre ordinateur portable risque de surchauffer, surtout s'il se trouve dans un étui étroit (même s'il ne reste allumé que quelques secondes à une minute).
J'ai utilisé cette méthode ces deux derniers jours, avec succès jusqu'à présent (et m'a évité une batterie à plat cet après-midi). Profitez-en.
Pour les autres distributions Linux qui utilisent systemd
et les versions Ubuntu plus récentes, cela devrait encore fonctionner si vous placez le script en /usr/lib/systemd/system-sleep
au lieu de /etc/pm/sleep.d
. Remplacez également le /usr/sbin/pm-hibernate
avec systemctl hibernate
.