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?

Jan Marek
la source

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 .)

ョ ー ジ
la source
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.

femme
la source
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é).

Ignacio Vazquez-Abrams
la source
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");'
Mark Lakata
la source
2

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

Pierre
la source
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
Nelgin
la source