能否对 "dmesg "的输出进行 "tail -f"?
我想做一些类似
dmesg | tail -f
的事情,但它不工作。
我使用Mac OS X v10.6.7 (Snow Leopard)。通过这样做,tail
会退出,而不是监控输出。
我不知道有没有办法,或者是一个等价的命令。
P.S.,我觉得while
的循环不够好。
我想做一些类似
dmesg | tail -f
的事情,但它不工作。
我使用Mac OS X v10.6.7 (Snow Leopard)。通过这样做,tail
会退出,而不是监控输出。
我不知道有没有办法,或者是一个等价的命令。
P.S.,我觉得while
的循环不够好。
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工作就好 "的方法,但先考虑下几个方法。
在我用的一个linux盒子上,用systemd init/*,dmesg.log并不经常被写入,也许根本没有?我发现最好的方法是用tail -f
来连续读取内核日志缓冲区。类似这样的方法应该可以让你开始使用 (根据你终端的行数来调整):
watch 'dmesg | tail -50'
一个更复杂的解决方案可能是使用 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行)
这是 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 -c
和sleep 1
(见Ben Harris的回答)。然而,由于这实际上是在运行时清除内核消息缓冲区,你可能还想把这些东西管到一个日志文件中,以备以后需要。
在看到这个帖子之前,我是这样做的。
#!/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;
这里有一些针对有限环境的想法
诸如嵌入式或预启动的环境,其中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 *
```。
在目前的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
这可能很有用。
dmesg | tail -f -
使用 dmesg
操作符作为标准输出的快捷方式,将 -
的输出通过 tail 进行管道化。