วิธีการแปลงรูปแบบเวลา 'dmesg' เป็นรูปแบบเวลา 'จริง'


42

ฉันมี (ตัวอย่าง) รายการบันทึกนี้ในdmesgผลลัพธ์:

[600711.395348] do_trap: 6 callbacks suppressed

มีความเป็นไปได้ไหมที่จะแปลงเวลา 'dmesg' เป็น 'จริง' ถึงเวลาที่รู้เมื่อเหตุการณ์นี้เกิดขึ้น?

คำตอบ:


59

มันดูราวกับว่ามันถูกนำมาใช้เร็ว ๆ นี้สำหรับ Quantal (12.10): ดูhttp://brainstorm.ubuntu.com/idea/17829/

โดยทั่วไปจะมีการรายงานที่จะมีสวิทช์ใหม่ dmesg-T, --ctime


แก้ไข ในฐานะที่เป็นส่วนขยายอื่นสำหรับคำตอบของ Ignacio นี่คือสคริปต์บางส่วนเพื่อเพิ่มประสิทธิภาพ dmesg ในระบบเก่า

(หมายเหตุ: สำหรับรหัสไพ ธ อนของรหัสที่แสดงที่นั่นหนึ่งจะต้องการแทนที่&lt;และ&gt;กลับไป<>เพื่อให้สามารถใช้งานได้อีกครั้ง)


ในที่สุดสำหรับค่าเดียว600711.395348อย่างที่ทำได้

ut=`cut -d' ' -f1 </proc/uptime` 
ts=`date +%s` 
date -d"70-1-1 + $ts sec - $ut sec + 600711.395348 sec" +"%F %T"

และรับวันที่และเวลาของเหตุการณ์

(โปรดทราบว่าเนื่องจากข้อผิดพลาดในการปัดเศษตัวเลขสองหลักสุดท้ายอาจไม่ถูกต้อง)

แก้ไข (2) : โปรดทราบว่า - ตามความคิดเห็นของ Womble ด้านล่าง - สิ่งนี้จะใช้งานได้หากเครื่องไม่จำศีล ฯลฯ (ในกรณีนี้จะต้องดูการกำหนดค่าsyslogที่/etc/*syslog*และตรวจสอบไฟล์ที่เหมาะสมดูเพิ่มเติม : dmesg vs / var / messages )


4
และเป็นโบนัสเพิ่มเติมหากเครื่องถูกระงับคุณจะถึงวาระที่สมบูรณ์เพราะเวลาที่ใช้ในการนอนหลับนั้นไม่ได้ถูกนำมาคิด
womble

ความคิดเห็นของ Womble นั้นสำคัญมาก! มันจะแสดงเวลาที่ผิดถ้าใช้แล็ปท็อปที่จำศีลหรือตั้งค่าในโหมดสแตนด์บาย คุณควรใช้ไฟล์ /var/log/kern.log เพื่อดูไฟล์จริง
oligofren

One-liner:date -d"1970-01-01 + $(date +%s) sec - $(cut -d' ' -f1 </proc/uptime) sec + 600711.395348 sec" +"%F %T.%N %Z"
kgibm

หมายเหตุ: ฉันไม่สามารถแก้ไขความคิดเห็นของฉันได้อีกต่อไป แต่%Zควรเป็นUTCเพราะdate +%sจะส่งกลับวินาทีตั้งแต่ UTC จากนั้นจะต้องถูกแปลงเป็นเขตเวลาท้องถิ่น
kgibm

1
@kgibm: ฉันเห็นด้วยกับ (2); สำหรับ (1) ไม่ใช่ว่าฉันมีอะไรกับหนึ่ง liners - แต่ฉันไม่เห็นจุดมันที่นี่: รหัสข้างต้นเป็นเจตนาแบ่งเป็นสามบรรทัดสำหรับการอ่าน (ฉันต้องการคนที่จะเข้าใจว่ามัน ใช้งานได้ไม่ทำให้มันกะทัดรัดที่สุดเท่าที่จะเป็นไปได้สำหรับสิ่งนั้นฉันควรสร้างมันให้เรียงตามลำดับ) และขนาด (ฉันชอบที่จะมีชื่อตัวแปรที่ยาวกว่า แต่ก็ทำให้บรรทัดที่ 3 ดูเป็นฝันร้าย) ในทางกลับกันคุณอาจจะไม่พิมพ์ในสายยาวทั้งหมดในเทอร์มินัล แต่วางไว้ในไฟล์และทำให้สามารถดำเนินการได้ - ดังนั้นจึงไม่มีการชนะที่ยิ่งใหญ่เช่นนี้
ジョージ

17

เพื่อขยายคำตอบของอิกนาชิโอdmesgโดยทั่วไปแล้วรายการที่อยู่ในนั้นจะถูกบันทึกไว้ที่อื่นบนระบบผ่าน syslog ซึ่งจะให้เวลา "จริง" กับคุณ เว้นแต่อูบุนตูมีการเปลี่ยนแปลงเริ่มต้น Debian ชุด, /var/log/kern.logรายการบันทึกควรจะอยู่ใน


1
บน Cent OS 5 และ 6 รายการบันทึกจะอยู่ใน / var / log / messages
emerino

11

เวลาที่กำหนดใน dmesg เป็นวินาทีตั้งแต่การเริ่มต้นเคอร์เนล ดังนั้นเพียงแค่เพิ่มเวลาหลายวินาทีในการที่เคอร์เนลเริ่มทำงาน (คำแนะนำ: สถานะการออนไลน์)


1
จะใช้งานได้ต่อเมื่อคุณใช้ระบบที่ไม่เคยเข้าสู่โหมดสแตนด์บาย มิฉะนั้นคุณต้องใช้บันทึก
oligofren

2

บน busybox 3 ซับด้านบนไม่ทำงานดังนั้นนี่คือวิธีของฉันในการคำนวณหนึ่งครั้ง (แทนที่1628880.0ด้วยการdmesgประทับเวลาของคุณ):

perl -e '@a=split(`/proc/uptime`);print scalar(localtime(time()+$a[0] - 1628880.0)."\n");'


2

ฉันรู้ว่าตอนนี้เก่าแล้ว แต่ตอนนี้ dmesg มีตัวเลือกในตัว - หรือ - เวลาเพื่อแสดงเวลาในเวลาท้องถิ่น

root@bbs:/var/log# dmesg|tail -1
[50755952.379177] Out of memory in UB 1593: OOM killed process 3183 (sbbs) score 0 vm:747204kB, rss:242764kB, swap:88224kB

root@bbs:/var/log# dmesg -e|tail -1
[Feb20 17:10] Out of memory in UB 1593: OOM killed process 3183 (sbbs) score 0 vm:747204kB, rss:242764kB, swap:88224kB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.