Comment convertir le format d'heure 'dmesg' en un format 'réel'


42

J'ai (par exemple) cette entrée de journal en dmesgsortie:

[600711.395348] do_trap: 6 callbacks suppressed

Existe-t-il une possibilité de convertir ce temps "dmesg" en temps "réel" pour savoir quand cet événement se produira?

Réponses:


59

Il semble que cela ait été implémenté récemment pour Quantal (12.10): voir http://brainstorm.ubuntu.com/idea/17829/ .

Fondamentalement, dmesgaurait un nouveau commutateur -T, --ctime.


Modifier. Comme autre extension de la réponse d'Ignacio, voici quelques scripts pour améliorer la sortie de dmesg sur des systèmes plus anciens.

(Remarque: pour la version python du code affiché ici, on voudra remplacer &lt;et &gt;revenir à <>pour le rendre à nouveau utilisable.)


Enfin, pour une valeur unique comme 600711.395348on pourrait le faire

ut=`cut -d' ' -f1 </proc/uptime` 
ts=`date +%s` 
date -d"70-1-1 + $ts sec - $ut sec + 600711.395348 sec" +"%F %T"

et obtenez la date et l'heure de l'événement.

(Veuillez noter qu'en raison d'erreurs d'arrondi, le dernier chiffre de la seconde seconde ne sera probablement pas précis.).

Edit (2) : Veuillez noter que - conformément au commentaire de Womble ci-dessous, - cela ne fonctionnera que si la machine n'a pas été mise en veille prolongée, etc. (Dans ce cas, il est préférable de regarder la syslogconfiguration /etc/*syslog*et de vérifier les fichiers appropriés. Voir aussi : dmesg vs / var / messages .)


4
Et, bonus supplémentaire, si la machine a déjà été suspendue, vous êtes complètement condamné, car le temps passé à dormir n’est pas comptabilisé.
Womble

Le commentaire de Womble est super imporant! Il indiquera le mauvais moment si vous utilisez un ordinateur portable qui est en veille ou est en veille. Vous devez utiliser le fichier /var/log/kern.log pour voir le fichier réel.
oligofren

One-Liner:date -d"1970-01-01 + $(date +%s) sec - $(cut -d' ' -f1 </proc/uptime) sec + 600711.395348 sec" +"%F %T.%N %Z"
kgibm

Remarque: je ne peux plus modifier mon commentaire, mais au lieu de %Z, il devrait l'être UTC, car date +%srenvoie les secondes depuis l'heure UTC. Il devrait alors être converti au fuseau horaire local.
kgibm

1
@kgibm: je suis d'accord avec (2); Pour ce qui est de (1), ce n’est pas que j’ai quelque chose contre les monolignes - mais je ne vois vraiment aucun intérêt à le faire ici: le code ci-dessus est scindé intentionnellement en trois lignes pour plus de lisibilité (j’ai besoin que les gens comprennent comment fonctionne, pas le rendre aussi compact que possible; pour cela, je vais mieux le construire séquentiellement) et la taille (j'aimerais avoir des noms de variable plus longs, mais cela donne à la ligne 3 un aspect cauchemardesque); D'un autre côté, vous n'allez probablement pas taper toute la longue ligne d'un terminal, mais plutôt le mettre dans un fichier et le rendre exécutable - donc pas de grosse victoire ici non plus.
dimanche

17

Pour prolonger la réponse de Ignacio, les entrées contenues dans dmesgsont généralement également consignées ailleurs sur le système, via syslog, ce qui vous donnera un "vrai" horodatage. À moins que Ubuntu n’ait modifié la valeur par défaut de l’ensemble Debian, les entrées du journal doivent être insérées /var/log/kern.log.


1
Sur Cent OS 5 et 6, l’entrée du journal se trouve dans / var / log / messages.
emerino

11

Le temps indiqué dans dmesg est en secondes depuis le démarrage du noyau. Donc, ajoutez simplement autant de secondes à la mise en marche du noyau (indice: temps de disponibilité).


1
Cela ne fonctionnera que si vous utilisez un système qui ne passe jamais en veille. Sinon, vous devez utiliser les journaux.
oligofren

2

Sur busybox, les 3 lignes ci-dessus ne fonctionnent pas, donc voici comment je peux les calculer un par un (remplacez-les 1628880.0par votre dmesghorodatage):

perl -e '@a=split(`/proc/uptime`);print scalar(localtime(time()+$a[0] - 1628880.0)."\n");'

2

dmesg | perl -pe 'use Unix::Uptime; s/^\[(.*)\]/localtime(time()-Unix::Uptime->uptime()+$1)/e'


2

Je sais que cela est maintenant vieux, mais dmesg a maintenant une option intégrée dans -e ou --reatime pour afficher l’heure locale.

root@bbs:/var/log# dmesg|tail -1
[50755952.379177] Out of memory in UB 1593: OOM killed process 3183 (sbbs) score 0 vm:747204kB, rss:242764kB, swap:88224kB

root@bbs:/var/log# dmesg -e|tail -1
[Feb20 17:10] Out of memory in UB 1593: OOM killed process 3183 (sbbs) score 0 vm:747204kB, rss:242764kB, swap:88224kB
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.