जवाबों:
dmesg
कर्नेल लॉग रिंग बफर पढ़ता है। यह टाइमस्टैम्प नहीं करता है। आपको क्या करना चाहिए, उस बफर से कर्नेल लॉग को हथियाने के लिए syslog को कॉन्फ़िगर करें और उन्हें एक फ़ाइल पर भेजें (यदि ऐसा करने के लिए पहले से सेट नहीं है)। ध्यान दें, डिफ़ॉल्ट CentOS 5.x syslog विन्यास कर्नेल लॉग भेजता है /var/log/messages
, जैसा कि मुझे याद है।
यदि आप /var/log/kern.log
डिफ़ॉल्ट साइनसॉल डेमॉन का उपयोग करके सभी कर्नेल (dmesg) लॉग भेजना चाहते हैं, तो आप निम्न की तरह एक पंक्ति जोड़ेंगे/etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
वहाँ समाधान है "dmesg / कर्नेल रिंग बफर के लिए टाइमस्टैम्प सक्षम करना"
आप जोड़ सकते हैं:
printk.time=1
कर्नेल cmdline के लिए।
मेरे लिए, मैंने कठपुतली के साथ सभी मशीनों पर r.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
अंत में आप एक नाजुक, दृढ़, गन्दा, अविश्वसनीय स्टार्ट-अप के साथ सामान को नष्ट कर देंगे।
मैंने यह सरल स्क्रिप्ट लिखी है। हां, यह धीमी है। यदि आप कुछ तेज चाहते हैं तो आप वास्तव में पर्ल, अजगर या कुछ और पर एक स्क्रिप्ट लिखेंगे। मुझे यकीन है कि यह सरल स्क्रिप्ट आपको यह बता सकती है कि इसकी गणना कैसे की जा सकती है।
कृपया ध्यान दें कि मैंने प्रत्येक पंक्ति में (टाइमस्टैम्प में) के बाद पंजीकृत सेकंड अंश को अनदेखा कर दिया है।
#!/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 $_;'
नीचे के रूप में थोड़ा पर्ल स्क्रिप्ट। यह एक सामान्य तरीका है, और मैं लेखक नहीं हूँ।
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
मानक इनपुट पढ़ने और चर $ _ में पढ़ने का एक तरीका है।s/...
कमांड $ _ में मूल्य लेता है और # dmesg ऑफ़सेट के "स्थानीय समय" संस्करण के साथ टाइमस्टैम्प के ##### # ##### भाग का विकल्प देता है ($ 1) ) सिस्टम स्टार्ट टाइम ($ a) में जोड़ा गया। - print $a
लोकल फ्रेंडली टाइम स्टैम्प के साथ dmesg प्रिंट करता है जो "स्टॉक्स चूंकि बूट" टाइम स्टैम्प है।