Eu tenho (por exemplo) esta entrada de log na dmesg
saí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?
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 <
e >
voltar <>
para torná-lo utilizável novamente.)
Finalmente, por um único valor, como 600711.395348
se 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 syslog
configurações /etc/*syslog*
e verificar os arquivos apropriados. : dmesg vs / var / messages .)
date -d"1970-01-01 + $(date +%s) sec - $(cut -d' ' -f1 </proc/uptime) sec + 600711.395348 sec" +"%F %T.%N %Z"
%Z
, deve serUTC
, poisdate +%s
retorna segundos desde o UTC. Teria então que ser convertido no fuso horário local.Para estender a resposta de Ignacio, as entradas contidas
dmesg
normalmente 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
.fonte
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).
fonte
No busybox, o liner 3 acima não funcionou, então aqui está a minha maneira de calculá-lo uma vez (substitua
1628880.0
pelodmesg
timestamp):fonte
dmesg | perl -pe 'use Unix::Uptime; s/^\[(.*)\]/localtime(time()-Unix::Uptime->uptime()+$1)/e'
fonte
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.
fonte