Я хотел бы прочитать мой Centos 5.x dmesg с отметкой времени, как мне это сделать?
dmesg
читает кольцевой буфер журнала ядра. Он не делает отметок времени. Что вам нужно сделать, так это настроить syslog на захват журналов ядра из этого буфера и отправку их в файл (если он еще не настроен для этого). Обратите внимание: конфигурация системного журнала CentOS 5.x по умолчанию отправляет журналы ядра в /var/log/messages
, насколько я помню.
Если вы хотите отправить все журналы ядра (dmesg) в /var/log/kern.log
, используя демон syslog по умолчанию, вы бы добавили следующую строку в /etc/syslog.conf
kern.* /var/log/kern.log
Есть решение "Включение меток времени для dmesg / Kernel Ring Buffer"
Вы можете добавить:
printk.time=1
в командную строку ядра.
Что касается меня, я добавил в rc.local на всех машинах с марионеткой. Мне так легче) :
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
Я написал этот простой сценарий. Да, это медленно. Если вам нужно что-то более быстрое, вы можете написать сценарий на 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
Это обновление предложения Plutoid, в котором из метки времени удалены начальные пробелы.
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
это способ читать стандартный ввод и читать в переменной $ _.