Я хотел бы прочитать мой Centos 5.x dmesg с отметкой времени, как мне это сделать?
dmesg -T
Я хотел бы прочитать мой Centos 5.x dmesg с отметкой времени, как мне это сделать?
dmesg -T
Ответы:
dmesg
читает кольцевой буфер журнала ядра. Это не делает отметки времени. Что вы должны сделать, это настроить системный журнал, чтобы получать журналы ядра из этого буфера и отправлять их в файл (если это еще не установлено). Обратите внимание, что конфигурация syslog CentOS 5.x по умолчанию отправляет журналы ядра /var/log/messages
, насколько я помню.
Если вы хотите отправить все журналы ядра (dmesg) /var/log/kern.log
, используя демон syslog по умолчанию, добавьте следующую строку в/etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
Существует решение «Включение меток времени для dmesg / Kernel Ring Buffer»
Вы можете добавить:
printk.time=1
в ядро cmdline.
Что касается меня, я добавил в rc.local на всех машинах с марионеткой. Это легче для меня) :
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
rc.local
- действительно уродливое решение для этого (использование rc.local
- почти всегда уродливое решение чего-либо). Лучшим решением было бы поместить printk.time = 1
в /etc/sysctl.conf
или файл в /etc/sysctl.d/
. Вот почему эти файлы существуют. Вбивание вещей в rc.local
конечном итоге оставит вас с хрупким, запутанным, грязным, ненадежным стартапом.
Я написал этот простой сценарий. Да, это медленно. Если вы хотите что-то быстрее, вы на самом деле пишете скрипт на Perl, Python или что-то еще. Я уверен, что этот простой скрипт может дать вам представление о том, как его можно рассчитать.
Обратите внимание, что я проигнорировал долю секунд, зарегистрированную в каждой строке (после. В метке времени).
#!/bin/bash
localtime() {
perl -e "print(localtime($1).\"\n\");";
}
upnow="$(cut -f1 -d"." /proc/uptime)"
upmmt="$(( $(date +%s) - ${upnow} ))"
dmesg | while read line; do
timestamp="$(echo "${line}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")"
timestamp=$(( ${timestamp} + ${upmmt} ))
echo "${line}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
done
Я надеюсь, что это помогает. :)
Изменение скрипта в случае, если строка не начинается с "["
#!/bin/bash
localtime() {
perl -e "print(localtime($1).\"\n\");";
}
upnow=$(cut -f1 -d"." /proc/uptime)
upmmt=$(( $(date +%s) - ${upnow} ))
dmesg \
| while read LINE; do
if [ "$(echo ${LINE} | egrep -v "^\[")" == "" ] ; then
timestamp=$(echo "${LINE}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")
timestamp=$(( ${timestamp} + ${upmmt} ))
echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
else
echo "${LINE}"
fi
done
Это обновление по предложению Плутона, удаляющее пробелы из временной метки.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
Небольшой скрипт на Perl, как показано ниже. Это общий способ, а я не автор.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
способ чтения стандартного ввода и чтения в переменную $ _s/...
Команда принимает значение в $ _ и заменяет часть #####. ###### метки времени версией смещения dmesg «localtime» ($ 1 ) добавлено время запуска системы ($ a). - print $a
печатает dmesg с меткой времени, дружественной к локали, замененной меткой времени «секунды с момента загрузки».