ฉันกำลังเขียนไดรเวอร์อุปกรณ์ที่พิมพ์ข้อความแสดงข้อผิดพลาดลงในเอาต์พุตริงบัฟเฟอร์ dmesg ฉันต้องการที่จะเห็นผลลัพธ์ของdmesg
มันในขณะที่การเปลี่ยนแปลง
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันกำลังเขียนไดรเวอร์อุปกรณ์ที่พิมพ์ข้อความแสดงข้อผิดพลาดลงในเอาต์พุตริงบัฟเฟอร์ dmesg ฉันต้องการที่จะเห็นผลลัพธ์ของdmesg
มันในขณะที่การเปลี่ยนแปลง
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
ล่าสุดค่อนข้างdmesg
รุ่นให้เป็นตัวเลือกต่อไปนี้ ( -w
, --follow
) ซึ่งทำงาน analogously tail -f
ไป
ดังนั้นให้ใช้คำสั่งต่อไปนี้:
$ dmesg -wH
( -H
, --human
ช่วยให้คุณสมบัติใช้งานง่ายเหมือนสีเวลาญาติ)
ตัวเลือกเหล่านั้นมีอยู่ใน Fedora 19
-H
แต่เป็นอย่างอื่น
-w
ควรทำงานในอูบุนตูทุกรุ่นตั้งแต่ Utopic (14.10) เป็นต้นไป ( launchpad.net/ubuntu/+source/util-linux/+publishinghistoryแนะนำแพ็คเกจ Utopic รุ่นแรก ๆ สำหรับ 2.20 แต่ถึง 2.25 ตามเวลาที่เผยแพร่)
คุณสามารถใช้watch
คำสั่งที่มีไว้สำหรับสิ่งเช่นนี้
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
$((LINES-6))
ส่วนควรจะทำให้มันพอดีอย่างเป็นสถานีของคุณ
watch
เมื่ออุทธรณ์ของ dmesg
ดังนั้นมันจะไม่ได้จริงๆเปลี่ยนระหว่างสวดของ หนึ่งจะต้องใช้เสื้อคลุมที่จะสอบถามสถานะขั้ว
watch
ดังนั้นการเฝ้าดูจะดำเนินการคำสั่งด้วยนิพจน์ตัวแปรในนั้นซึ่งจะถูกขยายโดยเชลล์ที่เรียกใช้ แต่ละครั้ง. ลองใช้งานได้
watch
ใช้popen()
งานซึ่งหมายถึงเชลล์อีกตัวหนึ่งถูกวางไข่แล้วตัวแปรสภาพแวดล้อมจะถูกส่งมอบโดยมัน (และอัปเดตทุกครั้งที่รันการทำงาน) ยินดีที่ได้พบ
คุณไม่สามารถตรวจสอบผลลัพธ์ของdmesg
โดยตรงได้
อย่างไรก็ตามมีโอกาสสูงที่โมดูลของคุณจะไม่พิมพ์โดยตรงไปยัง ring-buffer ของ dmesg แต่ใช้สิ่งอำนวยความสะดวกการบันทึกเคอร์เนลแทน (ซึ่งจะแสดงโดยdmesg
) หากคุณsyslog
มีการตั้งค่าสติ (เช่นค่าเริ่มต้น) ข้อความเหล่านี้ส่วนใหญ่จะปรากฏในkern.log
logfile
ดังนั้นคุณสามารถทำสิ่งที่ชอบ:
tail -f /var/log/kern.log
/var/log/kern.log
ค่อนข้างเฉพาะ Linux สำหรับ OpenBSD (และอาจเป็นอย่างอื่น) สิ่งที่ dmesg ได้รับการเข้าสู่ระบบ / var / log / ข้อความ จริงอยู่ที่บางสิ่งบางอย่างไปที่นั่นด้วย
tail -f /var/log/{messages,kernel,dmesg,syslog}
ผ่านsuperuser: มันเป็นไปได้ที่จะ tail-f-the-output-of-dmesg
คุณใช้dmesg
เพื่อรับข้อความบันทึกของเคอร์เนล
เคอร์เนลตัวเองเข้าสู่แหวนบัฟเฟอร์คือเพียงแค่ในหน่วยความจำ ทีนี้ทุกอย่างdmesg
ก็คือเอาท์พุทเนื้อหาของริงบัฟเฟอร์นั้น หากคุณทำเช่นdmesg -c
นั้นก็จะลบบัฟเฟอร์วงแหวนหลังจากนั้น
ดังนั้นคุณสามารถทำสิ่งที่ชอบที่จะมีสิ่งที่ต้องการเทียบเท่าของที่ไม่ได้ทำงานwhile true; do dmesg -c; sleep 1; done
dmesg|tail
แต่สิ่งนี้จะลบริงบัฟเฟอร์ดังนั้นจึงต้องการพลังของรูท
อีกวิธีคือไฟล์/proc/kmsg
ที่อนุญาตให้ดูในบัฟเฟอร์ของริง คุณสามารถทำได้tail -f /proc/kmsg
แต่การทำเช่นนี้อนุญาตเพียงกระบวนการเดียวเท่านั้นและนี่คือภูตการบันทึกของคุณ - มันเป็นหน้าที่ของเราในการอ่านข้อความและเขียนลงในไฟล์จริง (โดยปกติจะอยู่ใน / var / log) ซึ่งสามารถอ่านได้ มันสามารถกำหนดค่าให้ส่งข้อความทั้งหมดไปยังไฟล์เดียวหรือส่วนต่าง ๆ เป็นไฟล์ที่แตกต่างกัน (แต่การกำหนดค่าขึ้นอยู่กับภูตการบันทึกของระบบของคุณ)
ดังนั้นให้ดูที่/var/log
ว่ามีไฟล์ใดที่เหมาะสมกับความต้องการของคุณและกำหนดค่าภูตการเข้าสู่ระบบของคุณเป็นอย่างอื่น
หากคุณกำลังใช้ระบบฝังตัว busybox ที่ใช้กันทั่วไปในระบบเช่น OpenWRT มีฟังก์ชั่น จำกัด มากและรองรับการตั้งค่าสถานะเพียง 2-3 เท่านั้น
หากคุณต้องการวิธีที่รวดเร็วและสกปรกในการพิมพ์เอาต์พุต dmesg บนหน้าจออย่างต่อเนื่องเมื่อมีการเปลี่ยนแปลงกิจกรรม bash loop จะทำงานได้ดี มันไม่เหมาะ แต่อย่างที่บอกไปแล้วว่า BusyBox dmesg ขาดฟังก์ชั่นมากมาย ฉันค้นหาต่อไปนี้มีผลเหมือนกันเมื่อป้อนในบรรทัดคำสั่ง:
$ while true; do dmesg -c ; sleep 1 ; done
คุณสามารถออกจากลูปด้วย Ctrl-C สลีป 1 คือหยุดการทำงานของ CPU โดยไม่จำเป็นและแฟล็ก -c จะล้างบัฟเฟอร์ในการโทรแต่ละครั้งดังนั้นคุณจึงไม่เห็นเอาต์พุตซ้ำทุกวินาที
บนระบบที่ใช้systemd
คุณสามารถ:
# journalctl -kf
ใช้ 2 คำสั่งจากเทอร์มินัลแยก:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
มันจะบรรลุผลที่คล้ายกัน