Làm thế nào tôi có thể thấy đầu ra dmesg khi nó thay đổi?


Câu trả lời:


178

Các dmesgphiên bản tương đối gần đây cung cấp tùy chọn theo dõi ( -w, --follow) hoạt động tương tự tail -f.

Vì vậy, chỉ cần sử dụng lệnh sau:

$ dmesg -wH

( -H, --humancho phép các tính năng thân thiện với người dùng như màu sắc, thời gian tương đối)

Các tùy chọn này có sẵn ví dụ trong Fedora 19.


2
Đẹp tìm thấy! Gentoo không mò mẫm -Hnhưng nếu không thì tại chỗ
unperson325680

Các công cụ không gian người dùng cần phải là phiên bản 2.22+. Người dùng Ubuntu phải chờ phiên bản 14.10 "không tưởng"
Daniel Alder

1
Ubuntu không mò mẫm -w - cần sử dụng đồng hồ (bên dưới)
Brent Faust

2
Wow một câu trả lời sysadmin sử dụng các cờ - mô tả được đặt tên thay vì các cờ đơn ký tự khó hiểu. BRAVO, SIR. BRAVO.
mã allyour

1
-wnên hoạt động trong mọi phiên bản Ubuntu từ Utopic (14.10) trở đi. ( Launchpad.net/ubuntu/+source/util-linux/+publishinghistory gợi ý các gói Utopic đầu đã cho 2.20, nhưng đạt 2,25 vào thời điểm nó được phát hành.)
mwfearnley

54

Bạn có thể sử dụng watchlệnh được dự định chính xác cho những thứ như thế này

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

các $((LINES-6))phần nên làm cho nó phù hợp độc đáo vào thiết bị đầu cuối của bạn.


2
Nếu bạn sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép (hoặc thoát ký hiệu đô la), bạn sẽ nhận được giá trị $ LINES mới cho mỗi lần gọi, do đó, nó sẽ điều chỉnh nếu bạn thay đổi kích thước thiết bị đầu cuối của mình.
P Daddy

Báo giá đơn sẽ ức chế mở rộng biến. Hơn nữa, biến chỉ được mở rộng một lần trong ví dụ này - khi gọi watch. Do đó, nó sẽ không thực sự thay đổi giữa các yêu cầu dmesg. Người ta sẽ cần sử dụng một trình bao bọc sẽ truy vấn trạng thái đầu cuối.
peterph

2
Đó là toàn bộ vấn đề. Các trích dẫn đơn cấm mở rộng biến khi shell chuyển các đối số sang watch, do đó watch sẽ thực thi lệnh với biểu thức biến trong đó, sẽ được mở rộng bởi shell mà nó gọi. Mỗi lần. Hãy thử nó, nó hoạt động.
P Daddy

Hmm, bạn đã đúng - Tôi giả watchsử sử dụng popen(), có nghĩa là một shell khác được sinh ra và biến môi trường sau đó được cung cấp bởi nó (và do đó được cập nhật trên mỗi lần chạy thực thi). Đẹp tìm thấy.
peterph

12

bạn thực sự không thể theo dõi đầu ra của dmesgtrực tiếp.

tuy nhiên, rất có thể mô-đun của bạn không in trực tiếp vào bộ đệm vòng của dmesg, mà thay vào đó sử dụng các phương tiện ghi nhật ký kernel (sau đó sẽ được hiển thị bởi dmesg). nếu bạn syslogcó một số cài đặt lành mạnh (ví dụ mặc định), những thông báo này rất có thể cũng sẽ hiển thị trong kern.loglogfile.

để bạn có thể làm một cái gì đó như:

 tail -f /var/log/kern.log

/var/log/kern.loglà khá cụ thể của Linux. Đối với OpenBSD (và có thể cả những người khác), nội dung dmesg được đăng nhập / var / log / message. Cấp, một số thứ khác cũng đi đến đó mặc dù.
kurtm

2
tail -f /var/log/{messages,kernel,dmesg,syslog}thông qua siêu người dùng: is-it-could-to-tail-f-the-output-of-dmesg
ở đây

9

Bạn sử dụng dmesgđể có được thông điệp tường trình của kernel.

Hạt nhân tự đăng nhập vào bộ đệm vòng, tức là chỉ trong bộ nhớ. Bây giờ tất cả dmesglà đầu ra nội dung của bộ đệm vòng đó. Nếu bạn làm điều dmesg -cđó cũng sẽ xóa bộ đệm vòng sau đó.

Do đó, bạn có thể làm một cái gì đó giống như while true; do dmesg -c; sleep 1; donecó một cái gì đó tương đương với việc không hoạt động dmesg|tail. Nhưng điều này xóa bộ đệm vòng và do đó cần quyền hạn root.

Một cách khác là tập tin /proc/kmsgcho phép xem trên bộ đệm vòng. Bạn có thể làm tail -f /proc/kmsg, nhưng điều này chỉ cho phép một quá trình và đây thường là trình nền đăng nhập của bạn. - Công việc của bạn là đọc các tin nhắn và ghi nó vào các tệp thực (thường là trong / var / log) nơi chúng có thể được đọc. Nó có thể được cấu hình để xuất tất cả các tin nhắn thành một tệp hoặc các phần khác nhau thành các tệp khác nhau. (Nhưng cấu hình phụ thuộc vào trình nền đăng nhập của hệ thống của bạn.)

Do đó, hãy xem /var/lognếu có bất kỳ tệp nào phù hợp với nhu cầu của bạn và định cấu hình trình nền đăng nhập của bạn nếu không.


//, Trên hệ thống CEntOS 6 tôi đang sử dụng, việc điều chỉnh và xem / Proc / kmsg không tạo ra đầu ra. [~] $ sudo tail -f / Proc / kmsg ♥% [~] $ sudo cat / Proc / kmsg ♥% [~] $
Nathan Basan

8

Nếu bạn đang sử dụng một hệ thống nhúng, busybox phổ biến trên các hệ thống như OpenWRT có chức năng rất hạn chế và chỉ có 2-3 cờ được hỗ trợ.

Nếu bạn muốn một cách nhanh chóng và bẩn để in đầu ra dmesg trên màn hình liên tục khi các sự kiện thay đổi, một vòng lặp bash đơn giản hoạt động tốt. Nó không lý tưởng nhưng như tôi đã đề cập, BusyBox dmesg thiếu rất nhiều chức năng. Tôi thấy những điều sau đây có tác dụng tương tự khi được nhập vào dòng lệnh:

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

bạn có thể thoát khỏi vòng lặp với Ctrl-C, chế độ ngủ 1 là dừng nó đập CPU một cách không cần thiết và cờ -c xóa bộ đệm trên mỗi cuộc gọi để bạn không thấy đầu ra lặp lại mỗi giây,


1
Thực sự hữu ích để gỡ lỗi android.
val

5

Trên các hệ thống sử dụng, systemdbạn cũng có thể:

# journalctl -kf

1
Ubuntu 14.10: ➜ ~ Tạp chí -kf Không tìm thấy tệp nhật ký.
Nathan Basan

0

Sử dụng 2 lệnh này từ các thiết bị đầu cuối riêng biệt:

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

Nó sẽ đạt được kết quả tương tự.


//, Điều này về cơ bản hướng dẫn dmesg nối đầu ra vào test.txt, phải không? Và lệnh thứ hai chỉ xem tập tin test.txt đó?
Nathan Basan

Cảm ơn .. vâng .. lệnh thứ 2 theo dõi các thay đổi của dmesg. cat / Proc / kmsg có thể đạt được đầu ra tương tự nhưng nó không lưu các bản ghi vào một tệp.
K_K
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.