ฉันจะเห็นเอาต์พุต dmesg ขณะที่มันเปลี่ยนแปลงได้อย่างไร?


141

ฉันกำลังเขียนไดรเวอร์อุปกรณ์ที่พิมพ์ข้อความแสดงข้อผิดพลาดลงในเอาต์พุตริงบัฟเฟอร์ dmesg ฉันต้องการที่จะเห็นผลลัพธ์ของdmesgมันในขณะที่การเปลี่ยนแปลง

ฉันจะทำสิ่งนี้ได้อย่างไร


คำตอบ:


178

ล่าสุดค่อนข้างdmesgรุ่นให้เป็นตัวเลือกต่อไปนี้ ( -w, --follow) ซึ่งทำงาน analogously tail -fไป

ดังนั้นให้ใช้คำสั่งต่อไปนี้:

$ dmesg -wH

( -H, --humanช่วยให้คุณสมบัติใช้งานง่ายเหมือนสีเวลาญาติ)

ตัวเลือกเหล่านั้นมีอยู่ใน Fedora 19


2
ยินดีที่ได้พบ! Gentoo ไม่ได้งุ่มง่าม-Hแต่เป็นอย่างอื่น
unperson325680

เครื่องมือพื้นที่ผู้ใช้จะต้องเป็นรุ่น 2.22+ ผู้ใช้ Ubuntu ต้องรอรุ่น 14.10 "utopic"
Daniel Alder

1
Ubuntu ไม่ต้องรอ -w - จำเป็นต้องใช้ watch (ด้านล่าง)
Brent Faust

2
ว้าวคำตอบดูแลระบบที่ใช้ - ชื่อ -descriptively-flags แทนธงตัวอักษรเดี่ยวที่คลุมเครือ BRAVO, SIR BRAVO
allyourcode

1
-wควรทำงานในอูบุนตูทุกรุ่นตั้งแต่ Utopic (14.10) เป็นต้นไป ( launchpad.net/ubuntu/+source/util-linux/+publishinghistoryแนะนำแพ็คเกจ Utopic รุ่นแรก ๆ สำหรับ 2.20 แต่ถึง 2.25 ตามเวลาที่เผยแพร่)
mwfearnley

54

คุณสามารถใช้watchคำสั่งที่มีไว้สำหรับสิ่งเช่นนี้

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

$((LINES-6))ส่วนควรจะทำให้มันพอดีอย่างเป็นสถานีของคุณ


2
หากคุณใช้เครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นเครื่องหมายคำพูดคู่ (หรือหลีกเลี่ยงเครื่องหมายดอลลาร์) คุณจะได้รับค่า $ LINES ใหม่สำหรับการเรียกใช้ทุกครั้งดังนั้นมันจะปรับถ้าคุณเปลี่ยนขนาดเทอร์มินัลของคุณ
P Daddy

เครื่องหมายคำพูดเดี่ยวจะยับยั้งการขยายตัวของตัวแปร นอกจากนี้ตัวแปรจะขยายตัวเพียงครั้งเดียวในตัวอย่างนี้ - watchเมื่ออุทธรณ์ของ dmesgดังนั้นมันจะไม่ได้จริงๆเปลี่ยนระหว่างสวดของ หนึ่งจะต้องใช้เสื้อคลุมที่จะสอบถามสถานะขั้ว
เตอร์

2
นั่นคือประเด็นทั้งหมด เครื่องหมายอัญประกาศเดี่ยวห้ามการขยายตัวของตัวแปรเมื่อเชลล์ส่งอาร์กิวเมนต์ไปที่watchดังนั้นการเฝ้าดูจะดำเนินการคำสั่งด้วยนิพจน์ตัวแปรในนั้นซึ่งจะถูกขยายโดยเชลล์ที่เรียกใช้ แต่ละครั้ง. ลองใช้งานได้
P Daddy

อืมคุณพูดถูก - ฉันถือว่าการwatchใช้popen()งานซึ่งหมายถึงเชลล์อีกตัวหนึ่งถูกวางไข่แล้วตัวแปรสภาพแวดล้อมจะถูกส่งมอบโดยมัน (และอัปเดตทุกครั้งที่รันการทำงาน) ยินดีที่ได้พบ
เตอร์

12

คุณไม่สามารถตรวจสอบผลลัพธ์ของdmesgโดยตรงได้

อย่างไรก็ตามมีโอกาสสูงที่โมดูลของคุณจะไม่พิมพ์โดยตรงไปยัง ring-buffer ของ dmesg แต่ใช้สิ่งอำนวยความสะดวกการบันทึกเคอร์เนลแทน (ซึ่งจะแสดงโดยdmesg) หากคุณsyslogมีการตั้งค่าสติ (เช่นค่าเริ่มต้น) ข้อความเหล่านี้ส่วนใหญ่จะปรากฏในkern.loglogfile

ดังนั้นคุณสามารถทำสิ่งที่ชอบ:

 tail -f /var/log/kern.log

/var/log/kern.logค่อนข้างเฉพาะ Linux สำหรับ OpenBSD (และอาจเป็นอย่างอื่น) สิ่งที่ dmesg ได้รับการเข้าสู่ระบบ / var / log / ข้อความ จริงอยู่ที่บางสิ่งบางอย่างไปที่นั่นด้วย
kurtm


9

คุณใช้dmesgเพื่อรับข้อความบันทึกของเคอร์เนล

เคอร์เนลตัวเองเข้าสู่แหวนบัฟเฟอร์คือเพียงแค่ในหน่วยความจำ ทีนี้ทุกอย่างdmesgก็คือเอาท์พุทเนื้อหาของริงบัฟเฟอร์นั้น หากคุณทำเช่นdmesg -cนั้นก็จะลบบัฟเฟอร์วงแหวนหลังจากนั้น

ดังนั้นคุณสามารถทำสิ่งที่ชอบที่จะมีสิ่งที่ต้องการเทียบเท่าของที่ไม่ได้ทำงานwhile true; do dmesg -c; sleep 1; done dmesg|tailแต่สิ่งนี้จะลบริงบัฟเฟอร์ดังนั้นจึงต้องการพลังของรูท

อีกวิธีคือไฟล์/proc/kmsgที่อนุญาตให้ดูในบัฟเฟอร์ของริง คุณสามารถทำได้tail -f /proc/kmsgแต่การทำเช่นนี้อนุญาตเพียงกระบวนการเดียวเท่านั้นและนี่คือภูตการบันทึกของคุณ - มันเป็นหน้าที่ของเราในการอ่านข้อความและเขียนลงในไฟล์จริง (โดยปกติจะอยู่ใน / var / log) ซึ่งสามารถอ่านได้ มันสามารถกำหนดค่าให้ส่งข้อความทั้งหมดไปยังไฟล์เดียวหรือส่วนต่าง ๆ เป็นไฟล์ที่แตกต่างกัน (แต่การกำหนดค่าขึ้นอยู่กับภูตการบันทึกของระบบของคุณ)

ดังนั้นให้ดูที่/var/logว่ามีไฟล์ใดที่เหมาะสมกับความต้องการของคุณและกำหนดค่าภูตการเข้าสู่ระบบของคุณเป็นอย่างอื่น


//, บนระบบ CEntOS 6 ที่ฉันใช้, ปรับและดู / proc / kmsg ไม่สร้างผลลัพธ์ [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
Nathan Basanese

8

หากคุณกำลังใช้ระบบฝังตัว busybox ที่ใช้กันทั่วไปในระบบเช่น OpenWRT มีฟังก์ชั่น จำกัด มากและรองรับการตั้งค่าสถานะเพียง 2-3 เท่านั้น

หากคุณต้องการวิธีที่รวดเร็วและสกปรกในการพิมพ์เอาต์พุต dmesg บนหน้าจออย่างต่อเนื่องเมื่อมีการเปลี่ยนแปลงกิจกรรม bash loop จะทำงานได้ดี มันไม่เหมาะ แต่อย่างที่บอกไปแล้วว่า BusyBox dmesg ขาดฟังก์ชั่นมากมาย ฉันค้นหาต่อไปนี้มีผลเหมือนกันเมื่อป้อนในบรรทัดคำสั่ง:

$ while true; do dmesg -c ; sleep 1 ; done

คุณสามารถออกจากลูปด้วย Ctrl-C สลีป 1 คือหยุดการทำงานของ CPU โดยไม่จำเป็นและแฟล็ก -c จะล้างบัฟเฟอร์ในการโทรแต่ละครั้งดังนั้นคุณจึงไม่เห็นเอาต์พุตซ้ำทุกวินาที


1
มีประโยชน์จริง ๆ สำหรับการดีบัก android
Val


0

ใช้ 2 คำสั่งจากเทอร์มินัลแยก:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

มันจะบรรลุผลที่คล้ายกัน


//, โดยพื้นฐานแล้วนี่สั่งให้ dmesg ต่อท้ายเอาต์พุตกับ test.txt ใช่ไหม? และคำสั่งที่สองเพียงแค่ดูไฟล์ test.txt นั้น
Nathan Basanese

ขอบคุณ .. ใช่ .. คำสั่งที่ 2 จะคอยเฝ้าดูการเปลี่ยนแปลงของ dmesg cat / proc / kmsg สามารถบรรลุผลลัพธ์ที่คล้ายกัน แต่ไม่ได้บันทึกบันทึกลงในไฟล์
K_K
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.