जवाबों:
dmesg
टाइमस्टैम्प को समझना बहुत आसान है: कर्नेल शुरू होने के बाद से सेकंड में समय है। इसलिए, स्टार्टअप के समय ( uptime
), आप सेकंड जोड़ सकते हैं और उन्हें जो भी स्वरूप आपको पसंद है, में दिखा सकते हैं।
या बेहतर, आप मानव पठनीय प्रारूप के -T
कमांड लाइन विकल्प का उपयोग कर सकते हैं dmesg
।
से आदमी पेज :
-T, --ctime
Print human readable timestamps. The timestamp could be inaccurate!
The time source used for the logs is not updated after system SUSPEND/RESUME.
rpm -qf /bin/dmesg => util-linux-2.13-0.56.0.2.el5
util-linux 2.20
रिलीज़ नोट्स के अनुसार यह विकल्प दिखाई दिया : ftp.kernel.org/pub/linux/utils/util-linux/v2.20/…
डॉ उत्तर की मदद से , मैंने एक वर्कअराउंड लिखा जो आपके .bashrc में डालने के लिए रूपांतरण करता है। अगर आपके पास टाइमस्टैम्प नहीं है या पहले से ही सही टाइमस्टैम्प नहीं है तो यह कुछ भी नहीं तोड़ेगा।
dmesg_with_human_timestamps () {
$(type -P dmesg) "$@" | perl -w -e 'use strict;
my ($uptime) = do { local @ARGV="/proc/uptime";<>}; ($uptime) = ($uptime =~ /^(\d+)\./);
foreach my $line (<>) {
printf( ($line=~/^\[\s*(\d+)\.\d+\](.+)/) ? ( "[%s]%s\n", scalar localtime(time - $uptime + $1), $2 ) : $line )
}'
}
alias dmesg=dmesg_with_human_timestamps
इसके अलावा, Dmesg टाइमस्टैम्प रूपांतरण तर्क पर एक अच्छी रीडिंग और जब कोई नहीं हो तो टाइमस्टैम्प कैसे सक्षम करें : https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk92677
local dmesg_bin=$(type -a dmesg | awk 'END { print $NF }')
type
ओवर का उपयोग क्यों कर रहे हैं which
, इस प्रश्न के लिए , इस प्रश्न को देखें । मैंने हालांकि बेकार ट्रिपल पाइप से बचने के लिए अपना जवाब संपादित किया।
"Dmesg -T" जैसे कि RHEL / CentOS 6 के बिना सिस्टम के लिए, मुझे "dmesg_with_human_timestamps" फ़ंक्शन पसंद आया, जो पहले लुकास-साइमन द्वारा प्रदान किया गया था। यह हमारे बड़े बक्से के साथ कुछ बक्से के साथ थोड़ी परेशानी है, हालांकि। यह बताता है कि dmesg में कर्नेल टाइमस्टैम्प व्यक्तिगत सीपीयू द्वारा रखे गए अपटाइम मान से प्राप्त होते हैं। समय के साथ यह वास्तविक समय घड़ी के साथ सिंक से बाहर हो जाता है। नतीजतन, हाल ही में dmesg प्रविष्टियों के लिए सबसे सटीक रूपांतरण सीपीयू घड़ी के बजाय / खरीद / अपटाइम पर आधारित होगा। उदाहरण के लिए, यहां एक विशेष CentOS 6.6 बॉक्स पर:
# grep "\.clock" /proc/sched_debug | head -1
.clock : 32103895072.444568
# uptime
15:54:05 up 371 days, 19:09, 4 users, load average: 3.41, 3.62, 3.57
# cat /proc/uptime
32123362.57 638648955.00
सीपीयू अपटाइम के लिए मिलीसेकंड में होने के कारण, यहां लगभग 5 1/2 घंटे की भरपाई होती है। इसलिए मैंने स्क्रिप्ट को संशोधित किया और इसे प्रक्रिया में देशी बैश में बदल दिया:
dmesg_with_human_timestamps () {
FORMAT="%a %b %d %H:%M:%S %Y"
now=$(date +%s)
cputime_line=$(grep -m1 "\.clock" /proc/sched_debug)
if [[ $cputime_line =~ [^0-9]*([0-9]*).* ]]; then
cputime=$((BASH_REMATCH[1] / 1000))
fi
dmesg | while IFS= read -r line; do
if [[ $line =~ ^\[\ *([0-9]+)\.[0-9]+\]\ (.*) ]]; then
stamp=$((now-cputime+BASH_REMATCH[1]))
echo "[$(date +"${FORMAT}" --date=@${stamp})] ${BASH_REMATCH[2]}"
else
echo "$line"
fi
done
}
alias dmesgt=dmesg_with_human_timestamps
तो केवज़ेरो ने एक कम गुदगुदी समाधान का अनुरोध किया, इसलिए मैं निम्नलिखित के साथ आया:
sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'
यहाँ एक उदाहरण है:
$ dmesg|tail | sed -r 's#^\[([0-9]+\.[0-9]+)\](.*)#echo -n "[";echo -n $(date --date="@$(echo "$(grep btime /proc/stat|cut -d " " -f 2)+\1" | bc)" +"%c");echo -n "]";echo -n "\2"#e'
[2015-12-09T04:29:20 COT] cfg80211: (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A)
[2015-12-09T04:29:23 COT] wlp3s0: authenticate with dc:9f:db:92:d3:07
[2015-12-09T04:29:23 COT] wlp3s0: send auth to dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: authenticated
[2015-12-09T04:29:23 COT] wlp3s0: associate with dc:9f:db:92:d3:07 (try 1/3)
[2015-12-09T04:29:23 COT] wlp3s0: RX AssocResp from dc:9f:db:92:d3:07 (capab=0x431 status=0 aid=6)
[2015-12-09T04:29:23 COT] wlp3s0: associated
[2015-12-09T04:29:56 COT] thinkpad_acpi: EC reports that Thermal Table has changed
[2015-12-09T04:29:59 COT] i915 0000:00:02.0: BAR 6: [??? 0x00000000 flags 0x2] has bogus alignment
[2015-12-09T05:00:52 COT] thinkpad_acpi: EC reports that Thermal Table has changed
यदि आप इसे थोड़ा बेहतर प्रदर्शन करना चाहते हैं, तो टाइमस्टैम्प को एक चर में बदले में खरीद लें :)
हाल के संस्करणों में, आप बस कॉल कर सकते हैं dmesg -T
।
यदि आपके पास एंड्रॉइड पर उदाहरण के लिए -T
विकल्प नहीं है dmesg
, तो आप busybox
संस्करण का उपयोग कर सकते हैं । निम्नलिखित कुछ अन्य मुद्दों को भी हल करता है:
[0.0000]
प्रारूप कुछ गलत रंग जानकारी की तरह दिखता है, उपसर्गों चाहते कि से पहले किया जाता है <6>
।यह इस ब्लॉग पोस्ट से प्रेरित है ।
#!/bin/sh
# Translate dmesg timestamps to human readable format
# uptime in seconds
uptime=$(cut -d " " -f 1 /proc/uptime)
# remove fraction
uptime=$(echo $uptime | cut -d "." -f1)
# run only if timestamps are enabled
if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then
dmesg | sed "s/[^\[]*\[/\[/" | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do
timestamp=$(echo $timestamp | cut -d "." -f1)
ts1=$(( $(busybox date +%s) - $uptime + $timestamp ))
ts2=$(busybox date -d "@${ts1}")
printf "[%s] %s\n" "$ts2" "$message"
done
else
echo "Timestamps are disabled (/sys/module/printk/parameters/time)"
fi
हालाँकि, ध्यान दें कि यह कार्यान्वयन काफी धीमा है।
पुराने Linux डिस्ट्रोस के साथ अभी तक एक और विकल्प रैपिंग स्क्रिप्ट का उपयोग करना है, उदाहरण के लिए पर्ल या पायथन में।
यहां देखें समाधान:
http://linuxaria.com/article/how-to-make-dmesg-timestamp-human-readable?lang=en http://jmorano.moretrix.com/2012/03/dmesg-human-readable-timestamps/