Cómo convertir el formato de tiempo 'dmesg' al formato de tiempo 'real'

42

Tengo (por ejemplo) esta entrada de registro en la dmesgsalida:

[600711.395348] do_trap: 6 callbacks suppressed

¿Existe la posibilidad de convertir este tiempo 'dmesg' en tiempo 'real' para saber cuándo sucedió este evento?

Jan Marek
fuente

Respuestas:

59

Parece que se implementó recientemente para Quantal (12.10): consulte http://brainstorm.ubuntu.com/idea/17829/ .

Básicamente, dmesgse informa que tiene un nuevo interruptor -T, --ctime.


Editar. Como otra extensión de la respuesta de Ignacio, aquí hay algunos scripts para mejorar la salida de dmesg en sistemas más antiguos.

(Nota: para la versión de python del código que se muestra allí, uno querrá reemplazarlo &lt;y &gt;volver <>a hacerlo para que se pueda volver a usar).


Finalmente, para un solo valor como 600711.395348uno podría hacer

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

y obtener la fecha y hora del evento.

(Tenga en cuenta que debido a errores de redondeo, el último segundo dígito probablemente no será exacto).

Editar (2) : Por favor, nota que - de acuerdo con el comentario de Womble a continuación, - esto sólo funcionará si la máquina no estaba en hibernación, etc. (En ese caso, uno se verá mejor en syslogconfiguraciones al /etc/*syslog*. Y comprobar los archivos correspondientes Ver también : dmesg vs / var / messages .)

ジ ョ ー ジ
fuente
44
Y, como una ventaja adicional, si la máquina alguna vez ha sido suspendida, estás completamente condenado, porque el tiempo que pasaste dormido no se tiene en cuenta.
womble
¡El comentario de Womble es súper importante! Mostrará el momento equivocado si usa una computadora portátil que hiberna o está en espera. Debe usar el archivo /var/log/kern.log para ver el archivo real.
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
Nota: Ya no puedo editar mi comentario, pero en lugar de hacerlo %Z, debería serlo UTC, ya que date +%sdevuelve segundos desde UTC. Entonces tendría que convertirse a la zona horaria local.
kgibm
1
@kgibm: estoy de acuerdo con (2); en cuanto a (1), no es que tenga nada en contra de una sola línea, pero en realidad no veo un punto aquí: el código anterior se divide intencionalmente en tres líneas para facilitar la lectura (necesito que la gente entienda cómo funciona) funciona, no hacerlo lo más compacto posible; para eso, será mejor construirlo secuencialmente) y el tamaño (me encantaría tener nombres de variables más largos, pero eso hace que la línea 3 parezca una pesadilla); por otro lado, probablemente no escriba toda la línea larga en una terminal, sino que la coloque en un archivo y haga que sea ejecutable, por lo que tampoco es una gran victoria aquí.
ジ ョ ー ジ
17

Para ampliar la respuesta de Ignacio, las entradas contenidas dmesgtambién se registran en otras partes del sistema, a través de syslog, que le dará una marca de tiempo "real". A menos que Ubuntu haya cambiado el valor predeterminado establecido por Debian, las entradas de registro deben estar en /var/log/kern.log.

womble
fuente
1
En Cent OS 5 y 6, la entrada de registro está en / var / log / messages.
emerino
11

El tiempo dado en dmesg es en segundos desde el inicio del kernel. Por lo tanto, solo agregue esos segundos a cuando el núcleo comenzó a ejecutarse (pista: tiempo de actividad).

Ignacio Vazquez-Abrams
fuente
1
Eso solo funcionará si está utilizando un sistema que nunca entra en modo de espera. De lo contrario, debe usar los registros.
oligofren
2

En busybox, el revestimiento de 3 arriba no funcionó, así que esta es mi manera de calcularlo una vez (reemplazar 1628880.0con su dmesgmarca de tiempo):

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

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

Piedra
fuente
2

Sé que esto ahora es antiguo, pero dmesg ahora tiene una opción incorporada -e o --reatime para mostrar la hora en la hora local.

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
fuente