Có thể `tail -f` là đầu ra của` dmesg` không?


137

Muốn làm một cái gì đó như

dmesg | tail -f

nhưng nó không hoạt động: Tôi sử dụng Mac OSX 10.6.7, bằng cách đó, phần đuôi sẽ thoát ra, thay vì theo dõi đầu ra.

Tôi tự hỏi nếu có bất kỳ cách nào để làm điều đó, hoặc bất kỳ lệnh tương đương. Tái bút, tôi không nghĩ rằng một whilevòng lặp sẽ là một ý tưởng đủ tốt.


hoạt động tốt trên hộp Ubuntu 10.04LTS của tôi. Một cách giải quyết khác là theo đuôi bất kỳ logfile nào mà syslog đang đưa các thông điệp kernel vào.

4
Trên Mac OSX, tệp đó là /var/log/kernel.log

1
@ Đồng nghĩa 2: Thật không may, kernel.logkhông chứa đầu ra giống như dmesg. Ví dụ: đối với ổ đĩa bị hỏng, lỗi đọc tệp dmesgchỉ định chính xác tệp nào không thể đọc được, trong khi kernel.logkhông may chỉ cung cấp thông báo ít hữu ích hơn:disk0s2: I/O error.
Ivan Vučica

3
Kể từ linux 3.5, bạn có thể làm dmesg -w.
Doug Richardson

Câu trả lời:


120

Bạn có thể đang tìm kiếm một số kết hợp thư từ các tệp nhật ký khác nhau. Thử:

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

Để có được một cái nhìn tổng quan khá tốt về hệ thống. Nếu bạn muốn nhiều hơn hoặc ít hơn thế, hãy nghiên cứu tệp nhật ký nào mà thư bạn muốn xem đang được đặt.

Cũng xem xét việc sử dụng multitailđể tập tin và mã màu và lọc nhiều tệp nhật ký cùng một lúc.

Chỉnh sửa: Điều này không liên quan lắm khi tôi trả lời, nhưng vì trang này nhận được rất nhiều lượt truy cập nên tôi nghĩ rằng đáng để đề cập đến việc các hệ thống mới hơn chạy systemd có điều này.

dmesg -w

5
Cảm ơn các re-up re : multitail. Trông có vẻ thú vị. Trong trường hợp của OS X, nó sẽ giống như : tail -f /var/log/{system.log,kernel.log}.
boehj

2
system.logkernel.logkhông chứa đầu ra chính xác của dmesgOS X. Ví dụ: đối với ổ đĩa bị hỏng, lỗi đọc tệp dmesgchỉ định chính xác tệp nào không thể đọc được, trong khi kernel.logkhông may chỉ cung cấp thông báo ít hữu ích hơn:disk0s2: I/O error.
Ivan Vučica

3
Đối với bản ghi, câu trả lời này không hoạt động trên OS X Mavericks (10.9) hoặc Arch Linux.
Elle Mundy

@Dan On Arch có thể bạn chưa cài đặt syslog daemon hoặc dịch vụ của nó được kích hoạt. Tôi đã nhận thấy rằng đó không phải là một phần của gói cơ sở mặc dù nó khá cơ bản. OSX dựa trên BSD và có nhiều đường dẫn khác nhau cho nhiều thứ. Bạn sẽ cần phải tìm ra cách thức và nơi hệ thống của bạn xử lý việc ghi nhật ký và điều chỉnh. Câu trả lời của tôi khá chung chung và bao gồm hầu hết các phân phối dựa trên FHS với syslog được kích hoạt, nhưng cũng có rất nhiều triển khai biến thể.
Caleb

1
++ về chỉnh sửa.
pstanton

56

Chỉ cần làm cho nó @ # $% ing làm việc

  1. Bạn muốn in đầu ra của dmesg, liên tục, ngay lập tức
  2. Dmesg đang in bộ đệm vòng nhân (xem man dmesg)
  3. Bộ đệm vòng kernel là một tệp Proc đặc biệt, /proc/kmsg(xem man proc)
  4. Đọc /proc/kmsgtrực tiếp, tức là cat /proc/kmsg.

Bây giờ, nếu bạn đọc hướng dẫn sử dụng Proc thân thiện, nó sẽ cảnh báo bạn nghiêm khắc chỉ cho phép một người dùng (người phải được đặc quyền) đọc /proc/kmsgcùng một lúc. Bất cứ điều gì thực hiện syslog bạn nên làm điều này, và có lẽ nó hoạt động với dmesg. Tôi không biết, tôi ra khỏi giải đấu của tôi ở đây, chỉ diễn giải hướng dẫn. Vì vậy, trong khi đây là cách "chỉ cần thực hiện @ # $% ing công việc", trước tiên hãy xem xét các phương pháp cặp đôi tiếp theo.

Trang người đàn ông đã được phê duyệt: xem + dmesg

Trên Arch gnu / linux với systemd init *, dmesg.log không được viết thường xuyên, có lẽ không phải vậy? Cách tốt nhất tôi tìm thấy để đọc bộ đệm nhật ký kernel liên tục là với watch. Một cái gì đó như thế này sẽ giúp bạn bắt đầu (điều chỉnh xem có bao nhiêu dòng phù hợp trong thiết bị đầu cuối của bạn):

watch 'dmesg | tail -50'

xem + dmesg + daemon + đuôi -f

Một giải pháp phức tạp hơn có thể sử dụng đồng hồ để ghi đầu ra dmesg vào tệp, sau đó bạn có thể tail -f. Bạn có thể muốn điều này chạy như một daemon. Một daemon thích hợp cũng sẽ gzip và xoay các bản ghi. Mã bash sau đây chưa được kiểm tra, không hoạt động và chỉ nhằm truyền đạt một ý tưởng. Câu trả lời của @Brooks Moses có phiên bản hoạt động .

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

* tiếp tuyến, vì đây là câu hỏi osx, nhưng khi systemd xuất hiện, đừng bận tâm dmesg, hãy sử dụng journalctl -xf(có thể w / -n 100để cũng hiển thị 100 dòng trước đó)


1
OS X không có /proc, tuy nhiên phần còn lại của câu trả lời của bạn là có thể áp dụng. watchcó thể được cài đặt từ MacPorts: macports.org
Ivan Vučica

@Ivan Vučica Ah, thật tốt khi biết. Tự hỏi, nơi OSX đại diện cho bộ đệm vòng nhân ..
djeikyb

2
Có vẻ như nó trực tiếp trong bộ nhớ kernel. Mã nguồn cho của Apple dmesgthực hiện: opensource.apple.com/source/system_cmds/system_cmds-230.7/... nhanh Googling không đề cập đến bất cứ điều gì về nó được đại diện trong hệ thống tập tin: /
Ivan Vučica

42

Đối với những người quan tâm đến linux, vì kernel kernel 3.5.0:

# dmesg -w

Ngoài ra trên các hệ thống với systemdbạn có thể:

# journalctl -kf

6
dmesg -wlà giải pháp tuyệt vời nhất Thật không may, ngay cả Ubuntu 14.04 dường như chưa sẵn sàng cho việc này vì công cụ không gian người dùng chưa hỗ trợ.
Daniel Alder

1
Câu trả lời này chắc chắn xứng đáng nhận được nhiều sự ủng hộ hơn bây giờ.
m4tx

2
vâng, đây là một nugget nhỏ đẹp. có thể làm cho con người có thể đọc được với: dmesg -wH
faustus

21

Đây là một biến thể của câu trả lời của djeikyb thực sự đã được thử nghiệm và sửa một vài lỗi.

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

Thủ thuật quan trọng là chúng tôi đang thực hiện dmesg -c, việc xóa bộ đệm vòng sau khi in - do đó, mỗi lần chúng tôi chỉ in những gì mới kể từ lần trước. Bạn sẽ cần phải root để làm điều đó, do đó sudo. Ngoài ra còn có một lỗi; thay vì cố gắng kết xuất cả đầu ra vào một tệp và chuyển nó thành đuôi (không hoạt động), chúng ta chỉ đọc từ tệp mới được viết.

Chúng ta có thể thực hiện dmesg > /tmp/dmesg.logvà ghi đè lên toàn bộ tệp mỗi lần lặp, nhưng đó là rất nhiều I / O và cũng có nguy cơ mất tệp nếu máy tính gặp sự cố khi ghi đè.

Bạn cũng có thể làm một cái gì đó tương tự gần giống như tail -fvới vòng lặp while thực thi dmesg -csleep 1mãi mãi (xem câu trả lời của Ben Harris). Tuy nhiên, vì điều này thực sự đang xóa bộ đệm thông báo kernel khi nó đang chạy, bạn cũng có thể muốn chuyển mọi thứ vào một logfile trong trường hợp bạn muốn chúng sau này.


6

Điều này có thể làm việc cho bạn

while true;do sudo dmesg -c;done

Hãy nhớ rằng cờ '-c' sẽ xóa bộ đệm thông báo thành thiết bị xuất chuẩn. 'Sudo' là không cần thiết nếu bạn đã root. Nếu bạn cảm thấy việc này ăn quá nhiều tài nguyên CPU của mình, hãy thử thêm 'ngủ 1' trước khi hoàn thành vòng lặp.


Đồng hồ có thể tốt ở đó, nếu bạn luôn xem màn hình
Seth Robertson

2
Vui lòng trích dẫn nguồn của bạn: linuxforums.org/forum/appluggest/ từ

2
Nhanh chóng và hèn hạ. Bẩn vì nó chỉ hoạt động nếu bạn là người dùng duy nhất làm điều này. Nếu không, mỗi người dùng chỉ nhận được một nửa số tin nhắn
Daniel Alder

giải quyết vấn đề adb android của tôi.
PAntoine

5

Đã làm điều này trước khi xem bài này:

#!/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

bạn có thể làm được:

tail -f /var/log/messages

2
Trên hầu hết các hệ thống, tệp nhật ký dmesg chỉ là một kết xuất tĩnh của bộ đệm dmesg sau khi khởi động hệ thống hoàn tất. Sau đó, mọi thông điệp kernel mới thường đi vào một tệp nhật ký khác và tệp dmesg sẽ không thay đổi cho đến khi khởi động lại.

7
Tôi không biết về các hệ thống "nhất", nhưng không có hệ thống GNU Linux nào mà quản trị viên của tôi hành xử theo cách đó. dmesgbáo cáo một tập hợp các thông báo mới nhất từ ​​kernel, thường dành riêng cho các hệ thống con phần cứng.
Caleb

3

trong khi dmesg -c >> /tmp/dmesg.log; ngủ 0,1; xong & đuôi -f /tmp/dmesg.log


Xin vui lòng giải thích tại sao đây là một giải pháp.
ChrisF

Đó là những gì một số phân phối làm đằng sau hậu trường. Nó thăm dò ringbuffer kernel và đăng nhập nó vào /tmp/dmesg.log cứ sau 0,1 giây trong một công việc nền trong khi nó nối đuôi đầu ra đó. Ngoài ra, đó là phương pháp duy nhất sẽ hoạt động nếu bạn không có thứ gì đó đặc biệt chạy trong nền - hoặc nếu bạn đã giết tất cả các quy trình và dịch vụ nền và bạn đang xử lý sự cố khẩn cấp.
Dagelf

1
Có vẻ đơn giản hơn để sử dụngwatch
poolie

Nếu bạn có sẵn :-) đôi khi bạn ở trong một môi trường mà bạn thậm chí không có đuôi ... thì bạn có thể sử dụng cat /tmp/dmesg.log hoặc dd thậm chí ... Nếu bạn không thể viết đến / tmp và không thể gắn kết -t tmpfs - / tmp hoặc ramfs hoặc ghi vào / dev / shm / ... sau đó bạn có thể chỉ trong khi dmesg -c; ngủ 0,1; làm tiếng vang> / dev / null; xong, nếu bạn không ngủ, chỉ trong khi dmesg -c; làm tiếng vang> / dev / null; làm xong; Đôi khi bạn thậm chí không có ls ... sau đó bạn chỉ cần tạo ra tiếng vang * :-D
Dagelf 7/07/17

2

Tôi sử dụng bí danh này trong /root/.bashrc;

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

theo sau dmesg và điều chỉnh các dòng cho bất kỳ thiết bị đầu cuối nào nó được gọi.


0

Theo Ubuntu hiện tại (Tôi đang sử dụng Ubuntu 12.04),

tail -f /var/log/syslog

Có thể đáp ứng yêu cầu.


0

Tôi đã sử dụng mã này để tìm kiếm một sự kiện hạt nhân đặc biệt và đưa nó vào quá trình "gọi lại":

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

-2

trả lời một câu hỏi cũ, nhưng ai đó có thể thấy nó hữu ích :)

dmesg | đuôi -f -

chuyển đầu ra của dmesg qua đuôi bằng cách sử dụng toán tử - làm lối tắt cho thiết bị xuất chuẩn


2
Đây là mã từ câu hỏi không hoạt động.
pabouk

2
Nó không hoạt động vì dmesgđóng đầu ra sau khi đóng một lần. tail -fkhông thể thay đổi điều này nữa.
Daniel Alder
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.