Como converter o formato de hora 'dmesg' para o formato de hora 'real'

42

Eu tenho (por exemplo) esta entrada de log na dmesgsaída:

[600711.395348] do_trap: 6 callbacks suppressed

Existe a possibilidade de converter esse tempo 'dmesg' em tempo 'real' para saber quando esse evento aconteceu?

Jan Marek
fonte

Respostas:

59

Parece que foi implementado recentemente para Quantal (12.10): veja http://brainstorm.ubuntu.com/idea/17829/ .

Basicamente, dmesgé relatado ter um novo switch -T, --ctime.


Editar. Como outra extensão da resposta de Ignacio, aqui estão alguns scripts para aprimorar a saída do dmesg em sistemas mais antigos.

(Nota: para a versão python do código mostrado lá, será necessário substituir &lt;e &gt;voltar <>para torná-lo utilizável novamente.)


Finalmente, por um único valor, como 600711.395348se poderia fazer

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

e obtenha a data e hora do evento.

(Observe que, devido a erros de arredondamento, o último segundo dígito provavelmente não será preciso.).

Editar (2) : Observe que, conforme o comentário de Womble abaixo, isso só funcionará se a máquina não tiver sido hibernada, etc. (Nesse caso, é melhor examinar as syslogconfigurações /etc/*syslog*e verificar os arquivos apropriados. : dmesg vs / var / messages .)

ジ ョ ー
fonte
4
E, como um bônus adicional, se a máquina for suspensa, você estará completamente condenado, porque o tempo gasto no sono não é contabilizado.
womble
O comentário de Womble é super importante! Ele mostrará a hora errada se estiver usando um laptop que hiberna ou está em modo de espera. Você deve usar o arquivo /var/log/kern.log para ver o arquivo real.
Oligofren
Uma linha:date -d"1970-01-01 + $(date +%s) sec - $(cut -d' ' -f1 </proc/uptime) sec + 600711.395348 sec" +"%F %T.%N %Z"
kgibm 13/11
Nota: Não posso mais editar meu comentário, mas, em vez de %Z, deve ser UTC, pois date +%sretorna segundos desde o UTC. Teria então que ser convertido no fuso horário local.
kgibm
1
@kgibm: concordo com (2); quanto a (1), não é que eu tenha algo contra uma linha - mas na verdade não vejo razão para isso aqui: o código acima é intencionalmente dividido em três linhas para facilitar a leitura (preciso que as pessoas entendam como funciona, não o torna o mais compacto possível; para isso, melhor construí-lo-á sequencialmente) e tamanho (eu adoraria ter nomes de variáveis ​​mais longos, mas isso faz com que a linha 3 pareça um pesadelo); por outro lado, você provavelmente não digitará toda a linha longa em um terminal, mas a colocará em um arquivo e tornará executável - portanto, não há grande vitória aqui também.
ジョージ
17

Para estender a resposta de Ignacio, as entradas contidas dmesgnormalmente também são registradas em outro local do sistema, via syslog, que fornecerá um carimbo de data / hora "real". A menos Ubuntu mudaram o padrão Debian-set, as entradas de log deve estar em /var/log/kern.log.

mulher
fonte
1
No Cent OS 5 e 6, a entrada do log está em / var / log / messages.
Emerino
11

O tempo indicado no dmesg é em segundos desde a inicialização do kernel. Portanto, adicione apenas alguns segundos ao momento em que o kernel começou a ser executado (dica: tempo de atividade).

Ignacio Vazquez-Abrams
fonte
1
Isso só funcionará se você estiver usando um sistema que nunca entra em modo de espera. Caso contrário, você precisará usar os logs.
Oligofren
2

No busybox, o liner 3 acima não funcionou, então aqui está a minha maneira de calculá-lo uma vez (substitua 1628880.0pelo dmesgtimestamp):

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

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

Pedra
fonte
2

Eu sei que isso agora é antigo, mas o dmesg agora possui uma opção -e ou --reatime para exibir a hora no horário 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
fonte