「dmesg」時間形式を「実際の」時間形式に変換する方法


42

(たとえば)dmesg出力にこのログエントリがあります。

[600711.395348] do_trap: 6 callbacks suppressed

この「dmesg」時間を「リアル」時間に変換して、このイベントがいつ発生したかを知る可能性はありますか?

回答:


59

Quantal(12.10)に最近実装されたかのように見えます:http ://brainstorm.ubuntu.com/idea/17829/を参照してください。

基本的に、dmesg新しいスイッチがあると報告されてい-T, --ctimeます。


編集。イグナシオの答え上の別の拡張として、ここでは古いシステムでdmesgの出力を高めるためにいくつかのスクリプトがあります。

(注:コードのPythonのバージョンが示され、1つは交換したいだろう&lt;&gt;バックに<>それを再び使用できるようにします。)


最後に、単一の値のためのように600711.395348一つは行うことができます

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

イベントの日時を取得します。

(丸め誤差のため、最後の2桁目はおそらく正確ではないことに注意してください。)

Edit(2):以下のWombleのコメントによると、これはマシンが休止状態などになっていない場合にのみ機能することに注意してください(その場合、適切なファイルのsyslog設定を見て/etc/*syslog*、チェックする方が良いでしょう。 :dmesg vs / var / messages。)


4
また、追加のボーナスとして、マシンが一時停止された場合、眠っている時間が考慮されないため、完全に運命づけられます。
ウォンブル

Wombleのコメントは非常に重要です!休止状態またはスタンバイに設定されているラップトップを使用している場合、間違った時刻が表示されます。実際のファイルを確認するには、/ var / log / kern.logファイルを使用する必要があります。
オリゴフレン

ワンライナー:date -d"1970-01-01 + $(date +%s) sec - $(cut -d' ' -f1 </proc/uptime) sec + 600711.395348 sec" +"%F %T.%N %Z"
kgibm

注:コメントを編集することはできません%ZUTCdate +%sUTC からの秒数を返すため、の代わりにを使用する必要があります その後、ローカルタイムゾーンに変換する必要があります。
kgibm

1
@kgibm:(2)に同意します; (1)の場合と同様に、それは私がワンライナーに対して何かを持っていることではない-しかし、私は実際にここにそれのためのポイントが表示されていない。意図的に読みやすくするための3つの行に分割され、上記のコード(私は人々を必要と理解してどのようにそれを可能な限りコンパクトにするのではなく、動作します。そのため、連続して構築する方が良いでしょう)、サイズ(より長い変数名が欲しいのですが、3行目は悪夢のように見えます); 一方、おそらくターミナルでは長い行全体を入力するのではなく、ファイルに入れて実行可能にするので、ここでも大きな勝利はありません。
ジョージ

17

Ignacioの回答を拡張するために、含まれるエントリdmesgは通常、syslogを介してシステム上の別の場所にも記録されます。これにより、「実際の」タイムスタンプが得られます。UbuntuがDebianセットのデフォルトを変更していない限り、ログエントリはにあるはず/var/log/kern.logです。


1
Cent OS 5および6では、ログエントリは/ var / log / messagesにあります。
エメリーノ

11

dmesgで指定される時間は、カーネルが起動してからの秒数です。したがって、カーネルが実行を開始した時間(ヒント:稼働時間)にその秒数を追加するだけです。


1
これは、スタンバイ状態にならないシステムを使用している場合にのみ機能します。それ以外の場合は、ログを使用する必要があります。
オリゴフレン

2

busyboxでは、上記の3つのライナーは機能しませんでしたので、これを1回だけ計算する方法が1628880.0あります(dmesgタイムスタンプに置き換えてください):

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

私はこれが今では古いことを知っていますが、dmesgには現地時間で時刻を表示する組み込みの-eまたは--reatimeオプションがあります。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.