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

38

Eu tenho (por exemplo) essa entrada de log em dmesg output:

[600711.395348] do_trap: 6 callbacks suppressed

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

    
por Jan Marek 05.03.2012 / 08:31

6 respostas

53

Parece que foi implementado recentemente para o Quantal (12.10): veja link .

Basicamente, dmesg é reportado como tendo uma nova opção -T, --ctime .

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

(Nota: para a versão em python do código mostrado, você desejará substituir &lt; e &gt; de volta para <> para torná-lo utilizável novamente.)

Por fim, para um único valor como 600711.395348 , poderíamos 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 a hora do evento.

(Por favor, note que, devido a erros de arredondamento, o último segundo dígito provavelmente não será exato).

Edit (2) : Por favor, note que - conforme o comentário de Womble abaixo, - isso só funcionará se a máquina não estiver hibernando, etc. (Nesse caso, deve-se olhar melhor syslog configs em /etc/*syslog* e verifique os arquivos apropriados.Veja também: dmesg vs / var / messages .)

    
por 24.01.2013 / 02:27
16

Para estender a resposta de Ignacio, as entradas contidas em dmesg normalmente também são registradas em outro lugar no sistema, via syslog, que fornecerá um registro de data e hora "real". A menos que o Ubuntu tenha mudado o padrão do Debian, as entradas de log devem estar em /var/log/kern.log .

    
por 05.03.2012 / 08:42
9

O tempo dado no dmesg está em segundos desde a inicialização do kernel. Então, basta adicionar muitos segundos para quando o kernel começar a rodar (dica: uptime).

    
por 05.03.2012 / 08:37
1

No busybox, o 3 liner acima não funcionou, então aqui está a minha maneira de calcular um off (substitua 1628880.0 pelo seu dmesg timestamp):

perl -e '@a=split('/proc/uptime');print scalar(localtime(time()+$a[0] - 1628880.0)."\n");'
    
por 06.10.2015 / 17:37
1

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

    
por 09.01.2018 / 10:33
1

Eu sei que isso agora é antigo, mas o dmesg agora possui uma opção -e ou --reatime integrada para exibir a hora na 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
    
por 22.02.2018 / 09:26