web-dev-qa-db-fra.com

Comment obtenir la date / heure de la dernière mise en veille / suspension / reprise du système?

Comment obtenir la date/l'heure de ces événements:

  • dernière mise en veille/suspension du système
  • dernière reprise du système
3
user4955663

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.

0
user4955663

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.

1
Byte Commander