สำหรับระบบที่ไม่มี "dmesg -T" เช่น RHEL / CentOS 6 ฉันชอบฟังก์ชัน "dmesg_with_human_timestamps" ที่มีให้โดยlucas-cimonก่อนหน้านี้ มีปัญหาเล็กน้อยกับบางกล่องของเราที่มีเวลาพร้อมใช้งานมาก ปรากฎว่าการประทับเวลาเคอร์เนลใน dmesg ได้มาจากค่าเวลาทำงานที่เก็บไว้โดย CPU แต่ละตัว เมื่อเวลาผ่านไปสิ่งนี้จะไม่ตรงกับนาฬิกาเวลาจริง ด้วยเหตุนี้การแปลงที่ถูกต้องที่สุดสำหรับรายการ dmesg ล่าสุดจะขึ้นอยู่กับนาฬิกาของ CPU มากกว่า / proc / uptime ตัวอย่างเช่นในกล่อง 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
การคำนวณเวลาทำงานของ CPU เป็นมิลลิวินาทีมีค่าชดเชยเกือบ 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