2011-05-26 21:55:11 +0000 2011-05-26 21:55:11 +0000
146
146

能否对 "dmesg "的输出进行 "tail -f"?

我想做一些类似

dmesg | tail -f

的事情,但它不工作。

我使用Mac OS X v10.6.7 (Snow Leopard)。通过这样做,tail会退出,而不是监控输出。

我不知道有没有办法,或者是一个等价的命令。

P.S.,我觉得while的循环不够好。

答案 (11)

130
130
130
2011-05-26 22:04:06 +0000

你可能正在寻找来自不同日志文件的一些信息组合。试试

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

… …就可以得到一个很好的系统概览。如果你想知道更多或更少的信息,可以研究一下你想看到的信息被放在什么日志文件中。

也可以研究一下使用multitail来对多个日志文件进行归档和颜色编码,并同时过滤。

编辑: 当我回答这个问题的时候,这个问题并不是很相关,但是由于这个页面的点击率很高,我认为值得一提的是,运行systemd的新系统有这个问题。

dmesg -w
56
56
56
2011-06-11 22:42:51 +0000

1.你要不断地、立即地打印dmesg的输出 2.Dmesg正在打印内核环形缓冲区(见man dmesg) 3.Dmesg正在打印内核环形缓冲区。Dmesg正在打印内核环形缓冲区(见/proc/kmsg) 3. 内核环缓冲区是一个特殊的proc文件,man proc(见/proc/kmsg) 4. 直接读取cat /proc/kmsg,即/proc/kmsg

现在,如果你读了友好的proc手册,它会严厉警告你,一次只让一个用户(必须有特权)读取dmesg。不管你有什么syslog实现,都应该这样做,而且估计它可以和watch一起工作。我不知道,我在这里不懂,只是转述了一下手册。所以,虽然这是 “让它@#$%ing工作就好 "的方法,但先考虑下几个方法。

Man page approved: watch + dmesg

在我用的一个linux盒子上,用systemd init/*,dmesg.log并不经常被写入,也许根本没有?我发现最好的方法是用tail -f来连续读取内核日志缓冲区。类似这样的方法应该可以让你开始使用 (根据你终端的行数来调整):

watch 'dmesg | tail -50'

watch + dmesg + daemon + tail -f

一个更复杂的解决方案可能是使用 watch 将 dmesg 输出写到文件中,然后你可以 dmesg。你可能想让它作为一个守护进程运行。一个合适的守护进程也会对日志进行gzip和旋转。下面的bash代码是未经测试的,无法使用的,只是为了传达一个想法。@Brooks Moses的答案有一个【工作版本】(https://superuser.com/a/451650/66724)。

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

*题外话,因为这是一个关于苹果桌面操作系统的问题:当systemd在的时候,不要用journalctl -xf,用-n 100 (也许用0x6&也可以显示前100行)

47
47
47
2014-03-28 14:27:08 +0000

在Linux上,从内核3.5.0开始,你可以使用。

dmesg -w

systemd的系统上,你可以使用:

journalctl -kf
21
21
21
2012-07-20 21:45:27 +0000

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

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

重要的技巧是,我们正在做dmesg -c,它在打印后会清除环形缓冲区–因此,每次我们只打印上次之后的新内容。

你需要成为root才能做到这一点,因此才有了sudo。还有一个bug修正;我们不再试图同时将输出转储到文件和管道到尾巴(这行不通),而只是从新写的文件中读取。

我们可以只做dmesg > /tmp/dmesg.log,每次迭代都覆盖整个文件,但那是大量的I/O,而且如果计算机在覆盖过程中崩溃,也有丢失文件的风险。

你也可以做类似的事情,更接近于tail -f,用while循环,永远执行dmesg -csleep 1(见Ben Harris的回答)。然而,由于这实际上是在运行时清除内核消息缓冲区,你可能还想把这些东西管到一个日志文件中,以备以后需要。

5
5
5
2012-11-05 13:45:51 +0000

在看到这个帖子之前,我是这样做的。

#!/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
3
3
2013-03-05 08:26:53 +0000

这里有一些针对有限环境的想法

诸如嵌入式或预启动的环境,其中watch、tail、cat、dd和其他命令可能无法使用,可能需要不同的体操。

这是一些轻量级Linux发行版的做法:

while dmesg -c >> /tmp/dmesg.log; do sleep 0.1; done & tail -f /tmp/dmesg.log

它将while循环(用&)作为背景,同时尾随生成的输出。

如果你不能写到/tmp。

mount -t tmpfs - /tmp 

# or 
mount -t ramfs - /tmp 

# or use /dev/shm instead of /tmp - which is available in newer environments

如果你没有尾巴,你可以

cat /tmp/dmesg.log

# or 
dd if=/tmp/dmesg.log 

# or
dd if=/tmp/dmesg.log 2>/dev/null

或者你可能在一个没有dmesg链接的忙箱环境中,那么只要:

busybox dmesg -c

你可能还需要

busybox sleep

而不是sleep

如果你没有sleep:

while dmesg -c; do echo >/dev/null; done

如果你没有 “dmesg”:

while sleep 0.1; do cat -v /proc/kmsg; done

这只有在没有其他东西从这里读取的情况下才有效. 你也可能有一个/dev/kmsg。

额外提示:

如果你不知道你有什么,也没有 “ls",只需:

busybox ls

# or simply:

echo *
```。
3
3
3
2011-05-26 22:01:52 +0000

你也许可以这样做:

tail -f /var/log/messages
```。
3
3
3
2016-02-04 09:16:00 +0000

我在/root/.bashrc;

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

中使用了这个别名,它跟在dmesg后面,并为它所调用的任何终端调整行。

0
0
0
2012-12-17 04:37:01 +0000

在目前的Ubuntu下(我使用的是 Ubuntu 12.04 (Precise Pangolin)),

tail -f /var/log/syslog
6< <( cat /var/log/syslog |grep -F 'kernel: '; sudo cat /proc/kmsg) cat /dev/fd/6

(sudo命令需要sudo权限)

请你也试试另一个像。6< <( dmesg; sudo cat /proc/kmsg) cat /dev/fd/6

0
0
0
2016-01-22 22:49:10 +0000

我用这段代码来寻找一个特殊的内核事件,并将其作为一个 “回调 "进程。

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered -o $pattern \
| ...
-3
-3
-3
2014-01-15 08:08:27 +0000

这可能很有用。

dmesg | tail -f -

使用 dmesg 操作符作为标准输出的快捷方式,将 - 的输出通过 tail 进行管道化。