ฉันกำลังเขียนไดรเวอร์อุปกรณ์ที่พิมพ์ข้อความแสดงข้อผิดพลาดลงในเอาต์พุตริงบัฟเฟอร์ 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.loglogfile
ดังนั้นคุณสามารถทำสิ่งที่ชอบ:
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; donetail -f test.txtมันจะบรรลุผลที่คล้ายกัน