เป็นไปได้ไหมที่จะส่งออก `dmesg 'ออกไป?


137

อยากทำอะไรซักอย่าง

dmesg | tail -f

แต่มันไม่ทำงาน: ฉันใช้ Mac OSX 10.6.7 โดยการทำเช่นนั้นหางจะออกจากแทนการตรวจสอบผลลัพธ์

ฉันสงสัยว่ามีวิธีใดที่จะทำหรือคำสั่งใดเทียบเท่า ป.ล. ฉันไม่คิดว่าการwhileวนซ้ำจะเป็นความคิดที่ดีพอ


ทำงานได้ดีบนกล่อง Ubuntu 10.04LTS ของฉัน วิธีแก้ปัญหาคือปรับท้ายไฟล์บันทึกการทำงานที่ syslog ใส่ข้อความเคอร์เนลลงไป

4
สำหรับ Mac OSX ไฟล์นั้นเป็น /var/log/kernel.log

1
@Anonymous 2: น่าเสียดายที่kernel.logไม่มีเอาต์พุตเหมือนdmesgกัน ตัวอย่างเช่นสำหรับไดรฟ์ที่เสียหายข้อผิดพลาดการอ่านไฟล์ในการdmesgระบุไฟล์ที่ไม่สามารถอ่านได้ในขณะที่kernel.logน่าเสียดายที่มีเพียงการแจ้งเตือนที่เป็นประโยชน์น้อยกว่า:disk0s2: I/O error.
Ivan Vučica

3
ตั้งแต่ linux 3.5 คุณสามารถทำ dmesg -w
Doug Richardson

คำตอบ:


119

คุณอาจกำลังมองหาข้อความจากไฟล์บันทึกต่างๆ ลอง:

tail -f /var/log/{messages,kernel,dmesg,syslog}

... เพื่อให้ได้ภาพรวมที่ดีของระบบ หากคุณต้องการมากกว่าหรือน้อยกว่านั้นให้ทำการวิจัยว่าไฟล์บันทึกใดที่มีข้อความที่คุณต้องการดูอยู่

ดูที่การใช้multitailไฟล์และรหัสสีและกรองไฟล์บันทึกหลายไฟล์พร้อมกัน

แก้ไข:สิ่งนี้ไม่เกี่ยวข้องกันมากเมื่อฉันตอบคำถามนี้ แต่เนื่องจากหน้านี้ได้รับความนิยมจำนวนมากฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงว่าระบบที่ใหม่กว่าที่ใช้ systemd มีสิ่งนี้

dmesg -w

4
ขอบคุณสำหรับเรื่องที่ขึ้นหัวใหม่: multitail. ดูน่าสนใจ ในกรณีของ OS X tail -f /var/log/{system.log,kernel.log}ก็จะเป็นสิ่งที่ชอบ
boehj

2
system.logและkernel.logไม่มีเอาต์พุตที่แน่นอนของdmesgบน OS X ตัวอย่างเช่นสำหรับไดรฟ์ที่เสียหายข้อผิดพลาดการอ่านไฟล์ในการdmesgระบุไฟล์ที่ไม่สามารถอ่านได้ในขณะที่kernel.logน่าเสียดายที่มีเพียงการแจ้งเตือนที่มีประโยชน์น้อยกว่า:disk0s2: I/O error.
Ivan Vučica

3
สำหรับบันทึกคำตอบนี้ไม่สามารถใช้กับ OS X Mavericks (10.9) หรือ Arch Linux
Elle Mundy

@Dan On Arch คุณอาจไม่ได้ติดตั้ง syslog daemon หรือเปิดใช้งานบริการอยู่ ฉันสังเกตเห็นว่าไม่ได้เป็นส่วนหนึ่งของแพ็กเกจฐานแม้ว่ามันจะค่อนข้างพื้นฐาน OSX ขึ้นกับ BSD และมีเส้นทางที่แตกต่างกันสำหรับหลายสิ่ง คุณจะต้องทราบว่าระบบของคุณจัดการกับการบันทึกและปรับแต่งอย่างไร คำตอบของฉันค่อนข้างธรรมดาและครอบคลุม distros ตาม FHS ส่วนใหญ่ที่เปิดใช้งาน syslog แต่ก็มีการใช้งานที่หลากหลาย
คาเลบ

1
++ ในการแก้ไข
pstanton

56

เพียงแค่ทำให้มันทำงานได้ @ # $%

  1. คุณต้องการพิมพ์ผลงานของ dmesg อย่างต่อเนื่องทันที
  2. Dmesg กำลังพิมพ์บัฟเฟอร์วงแหวนเคอร์เนล (ดูman dmesg)
  3. บัฟเฟอร์วงแหวนเคอร์เนลเป็นไฟล์ proc พิเศษ/proc/kmsg(ดูman proc)
  4. อ่านโดยตรงคือ/proc/kmsgcat /proc/kmsg

ตอนนี้ถ้าคุณอ่านคู่มือ proc ที่เป็นมิตรมันจะเตือนคุณอย่างจริงจังว่าจะให้ผู้ใช้หนึ่งคน (ผู้ที่ต้องได้รับสิทธิพิเศษ) อ่าน/proc/kmsgต่อครั้ง สิ่งที่ดำเนินการ syslog dmesgคุณได้ควรจะทำเช่นนี้และสันนิษฐานว่ามันทำงานร่วมกับ ฉันไม่ได้ออกจากลีกของฉันที่นี่เพียงถอดความจากคู่มือ ดังนั้นในขณะที่นี่เป็นวิธี "เพิ่งทำให้ @ # $ ทำงานไอเอ็นจี" วิธีพิจารณาสองวิธีถัดไปก่อน

อนุมัติหน้า Man: watch + dmesg

ใน Arch gnu / linux ที่มี systemd init *, dmesg.log ไม่ได้ถูกเขียนขึ้นบ่อยนักบางทีอาจไม่ได้เลยเหรอ? วิธีที่ดีที่สุดที่ผมพบว่าการอ่านบัฟเฟอร์บันทึก kernel watchอย่างต่อเนื่องอยู่กับ สิ่งนี้จะช่วยให้คุณเริ่มต้นใช้งานได้ (ปรับตามจำนวนบรรทัดในเทอร์มินัลของคุณ):

watch 'dmesg | tail -50'

ดู + dmesg + daemon + tail -f

วิธีการแก้ปัญหาที่ซับซ้อนมากขึ้นอาจใช้นาฬิกาที่จะเขียนออก dmesg tail -fไปยังแฟ้มที่คุณสามารถทำได้แล้ว คุณอาจต้องการให้สิ่งนี้ทำงานเป็นดีมอน ภูตที่เหมาะสมก็จะ gzip และหมุนบันทึก รหัสทุบตีต่อไปนี้ยังไม่ได้ทดสอบไม่ทำงานและมีจุดประสงค์เพื่อถ่ายทอดความคิดเท่านั้น @Brooks คำตอบของโมเสสมีรุ่นที่ใช้งานได้

watch 'dmesg >> /var/log/dmesg.log | tail -1'

* แทนเจนต์, ทำให้นี่เป็นคำถามของ osx, แต่เมื่อ systemd อยู่ใกล้, อย่ารบกวนdmesg, ใช้journalctl -xf(อาจ-n 100จะแสดงด้วย 100 บรรทัดก่อนหน้านี้)


1
OS X ไม่มี/procแต่คำตอบที่เหลือของคุณสามารถนำไปใช้ได้ watchสามารถติดตั้งได้จาก MacPorts: macports.org
Ivan Vučica

@Ivan Vučicaพึงรู้ดี สงสัยว่า OSX หมายถึงเคอร์เนลบัฟเฟอร์ ..
djeikyb

2
ดูเหมือนว่าจะอยู่ในหน่วยความจำเคอร์เนลโดยตรง ซอร์สโค้ดสำหรับdmesgการนำไปใช้ของ Apple : opensource.apple.com/source/system_cmds/system_cmds-230.7/ … Googling ด่วนไม่พูดถึงสิ่งใดเกี่ยวกับมันที่แสดงในระบบไฟล์: /
Ivan Vučica

42

สำหรับผู้ที่สนใจใน linux ตั้งแต่เคอร์เนลเคอร์เนล 3.5.0:

# dmesg -w

ในระบบที่systemdคุณสามารถ:

# journalctl -kf

6
dmesg -wเป็นทางออกที่ดีที่สุดอย่างแน่นอน น่าเสียดายที่ Ubuntu 14.04 ยังไม่พร้อมสำหรับเรื่องนี้เนื่องจากเครื่องมือพื้นที่ผู้ใช้ยังไม่รองรับ
Daniel Alder

1
คำตอบนี้แน่นอนสมควรได้รับ upvotes มากขึ้นในขณะนี้
m4tx

2
ใช่นี่เป็นนักเก็ตตัวน้อยที่น่ารัก สามารถทำให้มนุษย์อ่านได้ด้วย: dmesg -wH
faustus

21

นี่คือตัวแปรในคำตอบของ djeikyb ที่ผ่านการทดสอบจริงและแก้ไขข้อบกพร่องสองสามข้อ

watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'

เคล็ดลับสำคัญคือเรากำลังทำอยู่dmesg -cซึ่งจะลบล้างบัฟเฟอร์วงแหวนหลังจากที่พิมพ์ออกมาดังนั้นทุกครั้งที่เราทำการพิมพ์สิ่งใหม่ ๆ นับตั้งแต่ครั้งสุดท้าย คุณจะต้องรูทเพื่อทำเช่นsudoนั้น นอกจากนี้ยังมีข้อผิดพลาด; แทนที่จะพยายามถ่ายโอนข้อมูลออกไปยังไฟล์และไพพ์ไปยังหาง (ซึ่งใช้งานไม่ได้) เราแค่อ่านจากไฟล์ที่เขียนใหม่

เราสามารถทำซ้ำdmesg > /tmp/dmesg.logและเขียนทับไฟล์ทั้งหมดในแต่ละการวนซ้ำ แต่นั่นเป็นจำนวนมากของ I / O และยังมีความเสี่ยงที่จะสูญเสียไฟล์หากคอมพิวเตอร์ล่มในระหว่างการเขียนทับ

คุณสามารถทำสิ่งที่คล้ายกันซึ่งคล้ายtail -fกับวนรอบที่ดำเนินการdmesg -cและsleep 1ตลอดไป (ดูคำตอบของ Ben Harris) อย่างไรก็ตามเนื่องจากนี่เป็นการล้างบัฟเฟอร์ข้อความเคอร์เนลขณะที่มันกำลังทำงานอยู่คุณอาจต้องการไพพ์สิ่งต่าง ๆ ลงในล็อกไฟล์ในกรณีที่คุณต้องการในภายหลัง


6

สิ่งนี้อาจใช้ได้ผลสำหรับคุณ

while true;do sudo dmesg -c;done

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


ดูอาจจะดีถ้าคุณดูหน้าจอตลอดเวลา
Seth Robertson

2
อย่าลังเลที่จะอ้างถึงแหล่งที่มาของคุณ: linuxforums.org/forum/applications/…

2
รวดเร็วและสกปรก สกปรกเพราะใช้งานได้เฉพาะเมื่อคุณเป็นผู้ใช้คนเดียวเท่านั้นที่ทำสิ่งนี้ มิฉะนั้นผู้ใช้แต่ละคนจะได้รับเพียงครึ่งหนึ่งของข้อความ
Daniel Alder

แก้ปัญหา adb android ของฉัน
PAntoine

5

ทำสิ่งนี้ก่อนที่จะเห็นโพสต์นี้:

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }        
    sleep 1;
}
exit;

3

คุณอาจจะทำ:

tail -f /var/log/messages

2
บนระบบส่วนใหญ่ไฟล์บันทึก dmesg เป็นเพียงดัมพ์แบบคงที่ของบัฟเฟอร์ dmesg หลังจากการบูตระบบเสร็จสมบูรณ์ หลังจากนั้นข้อความเคอร์เนลใหม่ใด ๆ มักจะเข้าไปในไฟล์บันทึกอื่นและไฟล์ dmesg จะไม่เปลี่ยนแปลงจนกว่าจะรีบูต

7
ฉันไม่รู้เกี่ยวกับระบบ "ส่วนใหญ่" แต่ไม่มีระบบ GNU Linux ใดที่ฉันดูแลระบบทำงานแบบนั้น dmesgรายงานชุดข้อความปัจจุบันล่าสุดจากเคอร์เนลซึ่งโดยปกติจะระบุเฉพาะกับระบบย่อยฮาร์ดแวร์
Caleb

3

ในขณะที่ dmesg -c >> /tmp/dmesg.log; นอนหลับ 0.1; เสร็จแล้ว & tail -f /tmp/dmesg.log


คุณช่วยอธิบายได้ว่าทำไมนี่เป็นวิธีแก้ปัญหา
ChrisF

มันคือสิ่งที่กระจายอยู่เบื้องหลัง มันทำการสำรวจเคอร์เนลของเคอร์เนลและบันทึกลงใน /tmp/dmesg.log ทุก ๆ 0.1 วินาทีในงานแบ็คกราวน์ขณะที่มันส่งเอาต์พุตนั้น นอกจากนี้ยังเป็นวิธีการเดียวที่จะใช้งานได้หากคุณไม่มีสิ่งที่ทำงานเป็นพิเศษในพื้นหลัง - หรือถ้าคุณฆ่ากระบวนการและบริการเบื้องหลังทั้งหมดและคุณกำลังทำการแก้ไขปัญหาฉุกเฉิน
Dagelf

1
ดูเหมือนง่ายต่อการใช้งานwatch
พะยูน

หากคุณมี :-) บางครั้งคุณอยู่ในสภาพแวดล้อมที่คุณไม่มีหาง ... คุณสามารถใช้ cat /tmp/dmesg.log หรือ dd แม้ ... ถ้าคุณไม่สามารถเขียนได้ ถึง / tmp และไม่สามารถเมานต์ -t tmpfs - / tmp หรือ ramfs หรือเขียนถึง / dev / shm / ... จากนั้นคุณสามารถทำได้ในขณะที่ dmesg -c; นอนหลับ 0.1; ทำเสียงก้อง> / dev / null; เสร็จสิ้นหากคุณไม่ได้นอนเพียง dmesg -c; ทำเสียงก้อง> / dev / null; ทำ; บางครั้งคุณไม่มี ls ... จากนั้นคุณแค่ทำ echo * :-D
Dagelf

2

ฉันใช้นามแฝงนี้ใน /root/.bashrc;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

ซึ่งติดตาม dmesg และปรับแต่งบรรทัดสำหรับเทอร์มินัลใดก็ตามที่เรียกว่า



0

ฉันใช้รหัสนี้เพื่อค้นหาเหตุการณ์เคอร์เนลพิเศษและ piped เป็นกระบวนการ "โทรกลับ":

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 

-2

ตอบคำถามเก่า แต่บางคนอาจพบว่ามีประโยชน์ :)

dmesg | หาง -f -

ไพพ์เอาต์พุตของ dmesg ผ่านหางโดยใช้ - โอเปอเรเตอร์เป็นทางลัดไปยัง stdout


2
นี่คือรหัสจากคำถามที่ใช้ไม่ได้
pabouk

2
ไม่ทำงานเนื่องจากdmesgปิดเอาต์พุตหลังจากปิดหนึ่งครั้ง tail -fไม่สามารถเปลี่ยนแปลงได้อีกต่อไป
Daniel Alder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.