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?

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


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.


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


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");'

2

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.