Comment obtenir la date/l'heure de ces événements:
Comme j'ai commenté la réponse de Byte Commader, pour au moins une raison sur mes deux installations Ubuntu 16, il semble que les événements "PM: suspend" et "PM: resume" soient tous les deux écrits dans syslog lors de la reprise. Ainsi, le temps de suspension dans cette solution est dans une seconde identique à l'heure de reprise. Cependant, l'heure de reprise est correcte.
Cette solution n'est donc pas basée sur des fichiers journaux. Il est basé sur un service très simple fonctionnant en continu et surveillant le décalage horaire avant et après un sommeil. Si la différence est beaucoup plus importante que le temps de sommeil, il y a eu une "pause", par ex. suspendre/reprendre l'opération. La pause est enregistrée après le réveil lorsque l'heure est synchronisée.
pauselogger.sh
set -e
if [[ "$#" < 1 || "$#" > 1 ]]
then
echo "Illegal number of parameters"
echo "Usage $0 <sleeptime in seconds>"
exit 1
fi
sleepTime=$1
fileName="/var/log/state.log"
dateStr1=$(date "+%Y-%m-%d %T.%N %z %s")
dateInt1=$(echo $dateStr1 | cut -d' ' -f4)
dateInt2=$dateInt1
dateStr2=$dateStr1
diff=0
for (( ; ; ))
do
diff="$(($dateInt1-$dateInt2))"
maxDiff=$(echo $sleepTime*1.1 + 1 | bc) # Pause is 10% longer than sleep.
if (( $(echo "$diff > $maxDiff" |bc -l) )); then
echo "$dateStr2 DOWN pre sleep" >> $fileName
echo "$dateStr1 UP post sleep $diff" >> $fileName
fi
dateStr2=$dateStr1
dateInt2=$dateInt1
sleep $sleepTime
dateStr1=$(date "+%Y-%m-%d %T.%N %z %s")
dateInt1=$(echo $dateStr1 | cut -d' ' -f4)
done
La définition du service est également un fichier simple: /etc/systemd/system/pauselogger.service
[Unit]
Description=Simple Pause Logger
[Service]
ExecStart=/usr/sbin/pauselogger.sh 30
Restart=on-failure
[Install]
WantedBy=multi-user.target
L'enregistreur est alors démarré et activé:
Sudo systemctl start pauselogger
Sudo systemctl enable pauselogger
Fichier journal:
2019-09-13 00:44:17.602146211 +0300 1568324657 UP post sleep 225
2019-09-13 01:04:59.968326886 +0300 1568325899 DOWN pre sleep
2019-09-13 10:25:18.575107533 +0300 1568359518 UP post sleep 33619
2019-09-13 10:49:41.594151484 +0300 1568360981 DOWN pre sleep
2019-09-13 10:51:57.129617072 +0300 1568361117 UP post sleep 136
Avantages de cette solution est qu'elle fonctionne malgré la commande pause. Il enregistre des pauses si le niveau du système d'exploitation suspend/hibernate/resume est utilisé, mais il fonctionne également s'il est utilisé à l'intérieur d'une machine virtuelle, par exemple VirtualBox savestate/resume.
Inconvénients sont au moins que les deux entrées de journal sont écrites pendant le réveil, cette solution ne convient pas, par exemple si un script doit être lancé juste avant l'opération savestate. De plus, la commande provoquant la mise en veille/le réveil n'est pas enregistrée: OS suspend vs vs VirtualBox savestate ou OS reprend vs VirtualBox start.
Vous pouvez examiner votre fichier journal système /var/log/syslog
pour les messages indiquant les événements suspend/hibernate/resume et regardez leurs horodatages.
Pour suspendre et reprendre, vérifiez par ex. ce modèle:
grep -E 'PM: suspend (entry|exit)' /var/log/syslog
Exemple de sortie:
Sep 8 09:43:26 type40mark3 kernel: [150509.893804] PM: suspend entry (deep)
Sep 8 15:03:39 type40mark3 kernel: [150514.147721] PM: suspend exit
Sep 8 16:33:41 type40mark3 kernel: [155914.275076] PM: suspend entry (deep)
Sep 8 17:04:58 type40mark3 kernel: [155919.343276] PM: suspend exit
Cela vérifie uniquement le fichier syslog actuel, mais comme il est soumis à la rotation des journaux, les messages plus anciens seront archivés dans des fichiers numérotés et compressés comme /var/log/syslog.1
et /var/log/syslog.2.gz
. Pour vérifier tous ces éléments en même temps, utilisez à la place zgrep
, qui peut lire les fichiers compressés, et sort
pour les remettre en ordre par la date d'horodatage réelle:
zgrep -hE 'PM: suspend (entry|exit)' /var/log/syslog* | sort -M
Pour obtenir uniquement les deux dernières lignes (dernière suspension et reprise, généralement), vous pouvez ajouter | tail -n 2
à l'une des commandes ci-dessus.
Si vous souhaitez uniquement suspendre ou reprendre uniquement, modifiez le modèle de filtre sur, par exemple. PM: suspend entry
ou PM: suspend exit
en conséquence.
Je n'ai pas de système d'hibernation disponible en ce moment pour rechercher les messages appropriés pour cet événement, mais je m'attends à quelque chose de similaire. Essayez de chercher par ex. grep hiber /var/log/syslog
pour trouver un motif approprié. Lorsque vous en avez un, veuillez commenter et je serai heureux de l'ajouter à cette réponse pour référence future.
Faites attention aux horodatages et comparez-les avec les temps réels réels que vous connaissez, car certains des messages "tardifs" comme systemd[1]: Started Suspend.
peut être déclenché juste avant que le système ne s'éteigne réellement, mais sera en fait enregistré et écrit sur le disque avec l'horodatage de sa remise sous tension.