Konvertieren des Zeitformats "dmesg" in das Echtzeitformat

42

Ich habe (zum Beispiel) diesen Protokolleintrag in der dmesgAusgabe:

[600711.395348] do_trap: 6 callbacks suppressed

Gibt es eine Möglichkeit, diese 'Dmesg'-Zeit in' Echtzeit'-Zeit umzuwandeln, um zu wissen, wann dieses Ereignis passiert ist?

Jan Marek
quelle

Antworten:

59

Es sieht so aus, als ob es kürzlich für Quantal (12.10) implementiert wurde: siehe http://brainstorm.ubuntu.com/idea/17829/ .

Grundsätzlich dmesgwird berichtet, einen neuen Schalter zu haben -T, --ctime.


Bearbeiten. Als eine weitere Erweiterung von Ignacios Antwort sind hier einige Skripte zur Verbesserung der dmesg-Ausgabe auf älteren Systemen.

(Hinweis: Für die Python-Version des dort gezeigten Codes möchten Sie ersetzen &lt;und &gt;zurück zu <>, um ihn wieder verwendbar zu machen.)


Schließlich für einen einzelnen Wert wie 600711.395348man tun könnte

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

und erhalte das Datum und die Uhrzeit des Ereignisses.

(Bitte beachten Sie, dass aufgrund von Rundungsfehlern die letzte zweite Ziffer möglicherweise nicht korrekt ist.)

Bearbeiten (2) : Bitte beachten Sie, dass - wie in Wombles Kommentar unten angegeben - dies nur funktioniert, wenn der Computer nicht in den Ruhezustand versetzt wurde usw. (In diesem Fall sollten Sie sich die syslogKonfigurationsdateien genauer ansehen /etc/*syslog*und die entsprechenden Dateien überprüfen. Siehe auch : dmesg vs / var / messages .)

ジ ョ ー ー
quelle
4
Und als zusätzlichen Bonus sind Sie völlig zum Scheitern verurteilt, wenn die Maschine jemals angehalten wurde, da die Zeit, die Sie im Schlaf verbracht haben, nicht berücksichtigt wird.
womble
Wombles Kommentar ist super wichtig! Wenn Sie einen Laptop verwenden, der sich im Ruhezustand befindet oder sich im Standby-Modus befindet, wird die falsche Uhrzeit angezeigt. Sie sollten die Datei /var/log/kern.log verwenden, um die aktuelle Datei anzuzeigen.
Oligofren
date -d"1970-01-01 + $(date +%s) sec - $(cut -d' ' -f1 </proc/uptime) sec + 600711.395348 sec" +"%F %T.%N %Z"
Einzeiler
Hinweis: Ich kann meinen Kommentar nicht mehr bearbeiten, aber stattdessen %Zsollte dies der Fall sein UTC, da er date +%sSekunden nach UTC zurückgibt. Es müsste dann in die lokale Zeitzone umgerechnet werden.
kgibm
1
@kgibm: Ich stimme zu (2); Was (1) betrifft, habe ich nichts gegen Einzeiler - aber ich sehe hier eigentlich keinen Grund dafür: Der obige Code ist aus Gründen der Lesbarkeit absichtlich in drei Zeilen unterteilt (ich muss verstehen, wie er funktioniert) funktioniert, mache es nicht so kompakt wie möglich; dafür baue ich es besser nacheinander auf) und Größe (ich hätte gerne längere Variablennamen, aber das lässt Zeile 3 alptraumhaft aussehen); Auf der anderen Seite werden Sie wahrscheinlich nicht die ganze lange Zeile in ein Terminal eingeben, sondern sie in eine Datei einfügen und ausführbar machen - also auch hier keinen großen Gewinn.
17

Um die Antwort von Ignacio zu erweitern, werden die darin enthaltenen Einträge dmesgnormalerweise auch an anderer Stelle im System über syslog protokolliert, wodurch Sie einen "echten" Zeitstempel erhalten. Sofern Ubuntu die Debian-Standardeinstellung nicht geändert hat, sollten sich die Protokolleinträge in befinden /var/log/kern.log.

womble
quelle
1
Unter Cent OS 5 und 6 befindet sich der Protokolleintrag in / var / log / messages.
Emerino
11

Die in dmesg angegebene Zeit ist in Sekunden seit dem Start des Kernels angegeben. Fügen Sie einfach so viele Sekunden hinzu, bis der Kernel gestartet wurde (Hinweis: Betriebszeit).

Ignacio Vazquez-Abrams
quelle
1
Dies funktioniert nur, wenn Sie ein System verwenden, das niemals in den Standby-Modus wechselt. Andernfalls müssen Sie die Protokolle verwenden.
Oligofren
2

Auf der Busybox hat der 3-Liner oben nicht funktioniert. Ich berechne ihn auf folgende Weise einmalig (ersetze ihn 1628880.0durch deinen dmesgZeitstempel):

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

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

Stein
quelle
2

Ich weiß, dass dies jetzt alt ist, aber dmesg hat jetzt eine eingebaute Option -e oder --reatime, um die Uhrzeit in der Ortszeit anzuzeigen.

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
quelle