web-dev-qa-db-fra.com

Dmesg Time vs Temps de temps du système n'est pas correct

J'espère qu'ici est quelqu'un qui peut m'aider avec ce problème étrange.

Je pense que je sais pourquoi cela se produit mais je ne sais pas comment résoudre. C'est peut-être parce que le temps de BIOS n'est pas défini correctement ou quelque chose comme ça. Mais je ne veux pas changer le temps du BIOS de serveurs approximatif de 400++. (Ou changer le BIOS BATT)

root@spool:~# echo TEST > /dev/kmsg
root@spool:~# dmesg -T | tail -1
[Mon Feb 17 04:57:03 2014] TEST
root@spool:~# date
Mon Feb 17 11:45:17 CET 2014

Le serveur exécute NTP pour la synchronisation de temps.

Quelqu'un ici qui sait comment résoudre ce problème dans le système d'exploitation?

Linux spool 3.2.0-4-AMD64 #1 SMP Debian 3.2.46-1+deb7u1 x86_64 GNU/Linux

Pourquoi, quand on fait écho à /dev/kmsg, la date/heure de mon message en dmesg n'est pas synchronisée avec la date/l'heure du système?

14
g00gle

dMESG imprime simplement la Ringbuffer du noyau qui enregistre des messages avec disponibilité en quelques secondes d'être démarré sous forme d'horodatage.

Donc, si vous utilisez l'option -t, toutes ces valeurs de disponibilité sont simplement ajoutées à la date de démarrage de votre système. Si vous avez eu des moments dormant en suspension ou de reprendre, ils sont perdus, donc dans cette affaire, l'option -t n'est pas utile, car les valeurs de date/heure ne sont pas correctes puis et de retour dans le passé.

12
JxO

Pour obtenir des heures précises pour les entrées "récentes" dans dmesg, vous pouvez convertir les horodatages DMESG en temps réel avec un piratage de la sortie.

Par "récent", je veux dire des moments après la dernière suspension/CV, puisque (comme d'autres déjà signalés) la suspension des temps ne comptaient pas dans l'horodatage DMESG.

Mais si vous en avez besoin souvent, comme sur un ordinateur portable, vous pouvez mettre quelque chose comme ce qui suit dans des fonctions ou des alias:

# write current time to kernel ring buffer
echo "timecheck: $(date +%s) = $(date +%F_%T)" | Sudo tee /dev/kmsg

# use our "timecheck" entry to get the difference
# between the dmesg timestamp and real time
offset=$(dmesg | grep timecheck | tail -1 \
| Perl -nle '($t1,$t2)=/^.(\d+)\S+ timecheck: (\d+)/; print $t2-$t1')

# pipe dmesg output through a Perl snippet to
# convert it's timestamp to correct readable times
dmesg | tail \
| Perl -pe 'BEGIN{$offset=shift} s/^\[(\d+)\S+/localtime($1+$offset)/e' $offset

# or use this instead to keep dmesg colors
dmesg --color=always | tail \
| Perl -pe 'BEGIN{$offset=shift} s/^(\x1b\[.*?m)?\[(\d+)\S+/$1.localtime($2+$offset)/e' $offset

Sortie d'échantillon:

...
Sat Jun 29 11:12:28 2019 wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
Sat Jun 29 11:12:28 2019 IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
Sat Jun 29 11:34:16 2019 timecheck: 1561800856 = 2019-06-29_11:34:16
Sat Jun 29 12:10:11 2019 wlp3s0: cannot understand ECSA IE operating class, 5, ignoring

Par rapport à l'original dmesg Sortie (qui est désactivé de 3 jours):

$ dmesg | tail -4
[249424.746958] wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
[249424.749662] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
[250732.318826] timecheck: 1561800856 = 2019-06-29_11:34:16
[252887.828699] wlp3s0: cannot understand ECSA IE operating class, 5, ignoring

$ dmesg -T | tail -4
[Wed Jun 26 17:59:09 2019] wlp3s0: Limiting TX power to 30 (30 - 0) dBm as advertised by 10:5a:f7:53:1d:0f
[Wed Jun 26 17:59:09 2019] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
[Wed Jun 26 18:20:57 2019] timecheck: 1561800856 = 2019-06-29_11:34:16
[Wed Jun 26 18:56:52 2019] wlp3s0: cannot understand ECSA IE operating class, 5, ignoring
3
mivk