Tôi đang viết trình điều khiển thiết bị in thông báo lỗi vào đầu ra dmesg bộ đệm vòng . Tôi muốn xem đầu ra của dmesg
nó thay đổi.
Tôi có thể làm cái này như thế nào?
Tôi đang viết trình điều khiển thiết bị in thông báo lỗi vào đầu ra dmesg bộ đệm vòng . Tôi muốn xem đầu ra của dmesg
nó thay đổi.
Tôi có thể làm cái này như thế nào?
Câu trả lời:
Các dmesg
phiê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
, --human
cho 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.
-H
nhưng nếu không thì tại chỗ
-w
nê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.)
Bạn có thể sử dụng watch
lệ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.
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.
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.
watch
sử 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.
bạn thực sự không thể theo dõi đầu ra của dmesg
trự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 syslog
có 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.log
logfile.
để bạn có thể làm một cái gì đó như:
tail -f /var/log/kern.log
/var/log/kern.log
là 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ù.
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
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ả dmesg
là đầ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; done
có 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/kmsg
cho 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/log
nế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.
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,
Trên các hệ thống sử dụng, systemd
bạn cũng có thể:
# journalctl -kf
Sử dụng 2 lệnh này từ các thiết bị đầu cuối riêng biệt:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Nó sẽ đạt được kết quả tương tự.