Centos 5.x dmesg'imi zaman damgası ile okumak istiyorum, bunu nasıl yaparım?
dmesg -T
Centos 5.x dmesg'imi zaman damgası ile okumak istiyorum, bunu nasıl yaparım?
dmesg -T
Yanıtlar:
dmesg
Çekirdek günlük halkası arabelleğini okur. Zaman damgaları yapmaz. Yapmanız gereken, syslog'u çekirdek günlüklerini bu arabellekten almak ve bir dosyaya göndermek için yapılandırmaktır (zaten ayarlanmamışsa). Not, varsayılan CentOS 5.x syslog config /var/log/messages
hatırladığım gibi, çekirdek günlüklerini gönderir .
Tüm çekirdek (dmesg) günlüklerini /var/log/kern.log
varsayılan syslog arka plan programını kullanarak göndermek isterseniz, aşağıdakine benzer bir satır eklersiniz./etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
"Dmesg / Kernel Ring Buffer için Zaman Damgalarını Etkinleştirme" çözümü var
Şunları ekleyebilirsiniz:
printk.time=1
çekirdek cmdline.
Bana gelince, kuklalı tüm makinelerde rc.local'a ekledim. Benim için daha kolay):
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
rc.local
bunun için gerçekten çirkin bir çözümdür (kullanmak rc.local
neredeyse her şeye çirkin bir çözümdür). Daha iyi bir çözüm, printk.time = 1
içine /etc/sysctl.conf
dosya koymak /etc/sysctl.d/
. Bu dosyaların var olmasının nedeni budur. Bir şeyleri içine sokmak rc.local
, sonunda sizi kırılgan, kıvrık, dağınık, güvenilir olmayan bir başlangıçla bırakacaktır.
Bu basit senaryoyu yazdım. Evet, yavaş. Daha hızlı bir şey istiyorsanız, perl, python veya başka bir şey üzerine bir komut dosyası yazabilirsiniz. Eminim bu basit script nasıl hesaplanabilir asmak verebilir.
Lütfen her satıra kaydedilen saniye bölümünü (zaman damgasındaki. İşaretinden sonra) yok saydığımı unutmayın.
#!/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
Umut ediyorum bu yardım eder. :)
Durum satırında komut dosyası değişikliği "[" ile başlamıyor
#!/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
Bu, Plutoid'in önerisiyle ilgili bir güncellemedir ve önde gelen alanları zaman damgasından kaldırır.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
Aşağıdaki gibi küçük bir perl betiği. Bu genel bir yol ve ben yazar değilim.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
standart girdiyi okumak ve $ _ değişkenine okumak için bir yoldur.s/...
Komut $ _ içindeki değeri alır ve zaman damgasının #####. ###### bölümünü dmesg ofsetinin "localtime" sürümüyle değiştirir ($ 1 ) sistem başlangıç zamanına eklendi ($ a). - print $a
"açılıştan bu yana saniye" zaman damgası yerine yerel dostu zaman damgası ile dmesg yazdırır.