是否可以将dmesg的输出设置为tail -f?


137

想做类似的事情

dmesg | tail -f

但它不起作用:我使用Mac OSX 10.6.7,这样做是尾部将退出,而不是监视输出。

我想知道是否有任何方法或任何等效命令。PS,我认为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.
IvanVučica2011年

3
从linux 3.5开始,您可以执行dmesg -w。
Doug Richardson 2014年

Answers:


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 2011年

2
system.log并且kernel.log不包含dmesgOS X上的确切输出。例如,对于损坏的驱动器,文件读取错误中dmesg准确指定了无法读取的文件,而kernel.log不幸的是,该通知仅提供了以下有用的提示:disk0s2: I/O error.
IvanVučica

3
记录下来,此答案不适用于OS X Mavericks(10.9)或Arch Linux。
Elle Mundy 2013年

@Dan在Arch上,您可能没有安装syslog守护程序或未启用其服务。我注意到,这虽然很基础,但它并不属于基本软件包。OSX基于BSD,并且在很多方面都有不同的路径。您需要弄清楚系统如何以及在哪里处理日志和进行调整。我的回答很通用,涵盖了大多数启用了syslog的基于FHS的发行版,但是也有很多变体实现。
Caleb 2013年

1
++上的编辑。
pstanton '18年

56

只需使其工作## $%ing

  1. 您要连续不断地立即打印dmesg的输出
  2. Dmesg正在打印内核环形缓冲区(请参阅参考资料man dmesg
  3. 内核环形缓冲区是一个特殊的proc文件,/proc/kmsg(请参阅参考资料man proc
  4. /proc/kmsg直接阅读,即cat /proc/kmsg

现在,如果您阅读了友好的proc手册,它将严格警告您一次只允许一个用户(必须具有特权)阅读/proc/kmsg。无论您使用哪种syslog实现,都应该这样做,并且大概可以使用dmesg。我不知道,我在手册外解释了我。因此,尽管这是“仅使@#$%ing工作”的方式,但请首先考虑以下两种方法。

批准的手册页:watch + dmesg

在具有systemd init *的Arch gnu / linux上,dmesg.log很少被写入,也许根本不被写入?我发现连续读取内核日志缓冲区的最佳方法是使用watch。这样的事情应该会让您入门(调整终端中可容纳的行数):

watch 'dmesg | tail -50'

观看+ dmesg +守护程序+尾-f

更复杂的解决方案可能是使用watch将dmesg输出写入文件,然后可以将其写入tail -f。您可能希望此程序作为守护程序运行。适当的守护程序还将gzip并旋转日志。以下bash代码未经测试,不起作用,仅用于传达想法。@Brooks Moses的答案有一个有效的版本

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

*切线,因为这是一个osx问题,但是当systemd在附近时,不要理会dmesg,请使用journalctl -xf(也许-n 100还显示前100行)


1
OS X没有/proc,但是其余答案适用。watch可以从MacPorts安装:macports.org
IvanVučica2011年

@IvanVučica啊,很高兴知道。想知道OSX表示内核环缓冲区..
djeikyb

2
看起来它直接在内核内存中。苹果dmesg实现的源代码:opensource.apple.com/source/system_cmds/system_cmds-230.7/…快速谷歌搜索没有提到它在文件系统中的表示:/
IvanVučica2011年

42

对于那些对linux感兴趣的人,从3.5.0内核开始:

# dmesg -w

同样在systemd您可以使用的系统上:

# journalctl -kf

6
dmesg -w是绝对最佳的解决方案。不幸的是,甚至Ubuntu 14.04似乎都还没有为此做好准备,因为用户空间工具尚不支持它。
Daniel Alder 2014年

1
这个答案绝对值得现在更多的投票。
m4tx 2015年

2
是的,这是一个不错的小块。dmesg的-WH:可制成人类可读的用
浮士德

21

这是djeikyb答案的一种变体,已经经过实际测试,并修复了一些错误。

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

重要的技巧是我们正在执行dmesg -c,它会在打印后清除环形缓冲区-因此,每次通过时,我们仅打印自上次以来的新内容。您需要具有root才能做到这一点,因此sudo。还有一个错误修正;我们只是尝试从新写入的文件中读取数据,而不是尝试将输出转储到文件中并通过管道发送到尾部(这不起作用)。

我们可以这样做,dmesg > /tmp/dmesg.log并在每次迭代时覆盖整个文件,但这会产生大量I / O,并且如果计算机在覆盖过程中崩溃,则可能会丢失文件。

你也可以做类似的东西,更紧密地就像tail -fwhile循环,执行dmesg -csleep 1永远的(见本·哈里斯的答案)。但是,由于这实际上是在内核消息缓冲区运行时清除它,因此您可能还希望将其通过管道传送到日志文件中,以备日后使用。


6

这可能对你有用

while true;do sudo dmesg -c;done

请记住,'-c'标志会将消息缓冲区清除到stdout中。如果您是root用户,则不需要'sudo'。如果您觉得这占用了过多的CPU资源,请在循环完成之前尝试添加“ sleep 1”。


如果您一直都在看屏幕,那看可能就不错了
塞斯·罗伯逊

2
随时引用您的消息源:linuxforums.org/forum/applications/…–

2
快速又脏。肮脏,因为只有在您是唯一这样做的用户时,它才起作用。否则,每个用户只会收到一半的消息
Daniel Alder 2014年

解决了我的android adb问题。
PAntoine '16

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; 完成&尾-f /tmp/dmesg.log


请您能解释一下为什么这是一个解决方案。
ChrisF

这就是某些发行版在后台执行的操作。它轮询内核环形缓冲区,并在后台作业中每隔0.1秒将其记录到/tmp/dmesg.log中,同时尾随该输出。另外,如果您没有在后台运行任何特殊操作,或者您已经杀死了所有后台进程和服务并且正在执行紧急故障排除,则这是唯一有效的方法。
Dagelf 2013年

1
似乎更易于使用watch
Poolie

如果您有可用的:-)有时您甚至在没有尾巴的环境中...那么您可以使用cat /tmp/dmesg.log或dd甚至...如果您无法编写到/ tmp,并且无法挂载-t tmpfs-/ tmp或ramfs,或者无法写入/ dev / shm / ...,那么您可以同时使用dmesg -c; 睡0.1; 做echo> / dev / null; 完成,如果您没有睡觉,就在dmesg -c时;做echo> / dev / null; 完成 有时您甚至没有ls ...然后您只是回显* :-D
Dagelf

2

我在/root/.bashrc中使用此别名;

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

紧随dmesg之后,针对所调用的任何终端调整行数。


0

在当前的Ubuntu(我正在使用Ubuntu 12.04)下,

tail -f /var/log/syslog

可以满足要求。


0

我使用以下代码查找特殊的内核事件,并将其通过“回调”过程进行管道传输:

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

-2

回答一个老问题,但有人可能会觉得有用:)

dmesg | 尾巴-f-

使用-运算符作为stdout的快捷方式将dmesg的输出通过尾部传递


2
这是来自问题的代码,不起作用。
pabouk

2
它不起作用,因为dmesg关闭一次后关闭输出。tail -f不能再更改了。
丹尼尔·奥尔德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.