Как преобразовать формат времени 'dmesg' в формат реального времени

42

У меня есть (например) эта запись журнала в dmesgвыводе:

[600711.395348] do_trap: 6 callbacks suppressed

Есть ли возможность преобразовать это время «dmesg» в «реальное» время, чтобы узнать, когда это событие произошло?

Ян Марек
источник

Ответы:

59

Это выглядит , как если бы он был реализовано в последнее время для квантового (12.10): см http://brainstorm.ubuntu.com/idea/17829/ .

В основном dmesgсообщается, что есть новый переключатель -T, --ctime.


Редактировать. В качестве еще одного дополнения к ответу Игнасио, вот несколько скриптов для улучшения вывода dmesg на старых системах.

(Примечание: для показанной там версии кода на python нужно будет заменить &lt;и &gt;вернуться, <>чтобы сделать его снова пригодным для использования.)


Наконец, для одного значения, как 600711.395348можно сделать

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

и получить дату и время события.

(Обратите внимание, что из-за ошибок округления последняя вторая цифра, вероятно, не будет точной.)

Редактировать (2) : Обратите внимание, что - согласно приведенному ниже комментарию Womble - это будет работать только в том случае, если машина не была переведена в спящий режим и т. Д. (В этом случае лучше посмотреть syslogконфиги /etc/*syslog*и проверить соответствующие файлы. См. Также : dmesg vs / var / messages .)

ジ ョ ー ジ
источник
4
И в качестве дополнительного бонуса, если машина когда-либо была приостановлена, вы полностью обречены, потому что время, проведенное во сне, не учитывается.
womble
Комментарий Womble очень важен! Он покажет неправильное время, если используется ноутбук, который находится в спящем режиме или находится в режиме ожидания. Вы должны использовать файл /var/log/kern.log, чтобы увидеть реальный файл.
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
Примечание: я больше не могу редактировать свой комментарий, но вместо этого %Zон должен быть UTC, поскольку date +%sвозвращает секунды с UTC. Затем он должен быть преобразован в местный часовой пояс.
кгм
1
@kgibm: я согласен с (2); что касается (1), то я не имею ничего против однострочников - но я не вижу смысла в этом здесь: приведенный выше код намеренно разделен на три строки для удобства чтения (мне нужны люди, чтобы понять, как это работает, не делайте его настолько компактным, насколько это возможно, для этого я лучше буду создавать его последовательно) и размер (я хотел бы иметь более длинные имена переменных, но это заставит строку 3 выглядеть кошмарной); с другой стороны, вы, вероятно, не наберете всю длинную строку в терминале, а скорее поместите ее в файл и создадите исполняемый файл - так что здесь тоже нет большого выигрыша.
ジ ョ ー ジ
17

Чтобы расширить ответ Игнасио, записи, содержащиеся в нем dmesg, также обычно регистрируются в другом месте системы через системный журнал, который даст вам «реальную» временную метку. Если Ubuntu не изменил установленный по умолчанию Debian, записи журнала должны быть в /var/log/kern.log.

romble
источник
1
В Cent OS 5 и 6 запись журнала находится в / var / log / messages.
Emerino
11

Время, указанное в dmesg, указывается в секундах с момента запуска ядра. Итак, просто добавьте столько секунд к моменту запуска ядра (подсказка: время безотказной работы).

Игнасио Васкес-Абрамс
источник
1
Это будет работать, только если вы используете систему, которая никогда не переходит в режим ожидания. В противном случае вам нужно использовать журналы.
oligofren
2

На busybox 3 лайнера выше не работали, так что вот мой способ рассчитать его один раз (замените 1628880.0на вашу dmesgвременную метку):

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

Я знаю, что он уже старый, но в dmesg теперь есть встроенная опция -e или --reatime для отображения времени по местному времени.

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
источник