我想做类似

dmesg | tail -f


的操作,但是它不起作用:

我使用的是Mac OS X v10.6.7(雪豹) 。这样,tail将退出,而不是监视输出。

我想知道是否有一种方法或等效命令。

PS,我不知道认为while循环将是一个好主意。

评论

在Mac OSX上,该文件为/var/log/kernel.log

@Anonymous 2:不幸的是,kernel.log不包含与dmesg相同的输出。例如,对于损坏的驱动器,dmesg中的文件读取错误确切指定了无法读取的文件,而kernel.log不幸的是仅提供了不到帮助的提示:disk0s2:I / O错误。
从linux 3.5开始,您可以执行dmesg -w。

unix.stackexchange.com/questions/95842/…

您可以执行sudo dmesg >>“ $ TMPDIR / dmesg.log”;在Mac上为tail -f“ $ TMPDIR / dmesg.log”。

#1 楼

您可能正在寻找来自各种日志文件的消息的某种组合。请尝试:

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


...以获得系统的良好概述。如果您想要的更多或更少,请研究您希望看到的消息放置在哪个日志文件中。

编辑:当我回答这个问题时,这不是很相关,但是由于此页面获得了很大的成功,我认为值得一提的是,运行systemd的较新系统具有此功能。 br />
dmesg -w


评论


感谢您的单挑,关于re:multitail。看起来很有趣。对于OS X,它将类似于:tail -f /var/log/{system.log,kernel.log}。

– boehj
2011年5月27日在3:21



system.log和kernel.log在OS X上不包含dmesg的确切输出。例如,对于损坏的驱动器,dmesg中的文件读取错误指定了无法读取的文件,而kernel.log不幸地提供了较少的-高于帮助的通知:disk0s2:I / O错误。

–伊凡(IvanVučica)
2011-10-25 17:45

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

– Elle Mundy
2013年12月24日15:31

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

–卡莱布
2013年12月24日15:38

++上的编辑。

– pstanton
18年5月8日在23:59

#2 楼

在Linux上,由于内核3.5.0内核,您可以使用: />

评论


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

–丹尼尔·奥尔德(Daniel Alder)
2014年8月25日在7:19



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

– m4tx
2015年5月3日,11:29

是的,这是一个不错的小块。可以使人可读:dmesg -wH

– faustus
15年8月26日在4:58



这适用于Ubuntu 19.10(Eoan Ermine)。

– Peter Mortensen
20年1月8日,下午2:52

dmesg -Hw用于人类可读+尾部的常见有用选项。

–gaoithe
20/12/22在16:41

#3 楼

只需使其工作## $%ing


您要连续不断地打印dmesg的输出
Dmesg正在打印内核环形缓冲区(请参阅man dmesg
内核环形缓冲区是一个特殊的proc文件,/proc/kmsg(请参阅man proc
直接阅读/proc/kmsg,即cat /proc/kmsg。您一次只允许一个用户(必须具有特权)阅读/proc/kmsg。无论您使用哪种syslog实现,都应该这样做,并且大概可以与dmesg一起使用。我不知道,我在手册外解释了我。因此,尽管这是“仅使@#$%ing工作”的方式,但请首先考虑以下两种方法。

批准的手册页:watch + dmesg

我与systemd init *一起使用的linux盒,dmesg.log很少写入,也许根本不写入?我发现连续读取内核日志缓冲区的最佳方法是watch。这样的事情应该可以让您入门(调整终端中可以容纳的行数): br />一个更复杂的解决方案可能是使用watch将dmesg输出写入文件,然后可以tail -f。您可能希望将此作为守护程序运行。适当的守护程序还将gzip并旋转日志。以下bash代码未经测试,不起作用,仅用于传达想法。 @Brooks Moses的答案有一个适用的版本。 dmesg;使用journalctl -xf(也许带有-n 100也可以显示前100行)

评论


OS X没有/ proc,但是其余的答案仍然适用。手表可以从MacPorts安装:macports.org

–伊凡(IvanVučica)
2011-10-25 17:44



@IvanVučica啊,很高兴知道。想知道OSX在哪里代表内核环形缓冲区。

– djeikyb
2011-10-27 22:49

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

–伊凡(IvanVučica)
2011-10-28 9:24

#4 楼

这是djeikyb答案的一种变体,已经经过实际测试,并修复了两个错误。在打印之后-因此,每次通过时,我们都只打印自上次以来的新内容。还有一个错误修正;而不是尝试将输出转储到文件中并通过管道传输到尾部(这不起作用),我们只是从新写入的文件中读取。每次迭代都会覆盖整个文件,但这会产生大量I / O,并且如果计算机在覆盖过程中崩溃,也可能会丢失文件。具有永久执行dmesg -csudodmesg > /tmp/dmesg.log循环的tail -f(请参阅Ben Harris的答案)。但是,由于这实际上是在运行时清除内核消息缓冲区,因此您可能还希望将其通过管道传送到日志文件中,以备日后使用。

#5 楼

这可能适合您

while true;do sudo dmesg -c;done


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

评论


如果您一直在看屏幕,那看可能很好

–塞斯·罗伯逊(Seth Robertson)
2011年5月26日在22:07

随时引用您的资源:linuxforums.org/forum/applications/…

–匿名
2011年5月26日在22:08

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

–丹尼尔·奥尔德(Daniel Alder)
2014年8月25日在7:14

解决了我的android adb问题。

– PAntoine
16年4月27日在10:25

#6 楼

我是在看这篇文章之前这样做的:

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


#7 楼

以下是针对有限环境的一些想法

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

这是一些轻量级Linux发行版的功能: br />
如果您无法写到/ tmp:

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


如果没有尾巴,可以

/>
mount -t tmpfs - /tmp 

# or 
mount -t ramfs - /tmp 

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


或者您可能处于没有dmesg链接的busybox环境中,然后:

cat /tmp/dmesg.log

# or 
dd if=/tmp/dmesg.log 

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



需要

busybox dmesg -c


代替睡眠

如果您没有睡眠:

busybox sleep


如果没有“ dmesg”:

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


仅当这里没有其他内容时,此方法才有效。您可能还具有/ dev / kmsg。

红利提示:

如果您不知道自己拥有什么,而又没有“ ls”,只需:



评论


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

– ChristF
13年5月5日在12:30

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

– Dagelf
2013年6月5日18:07



手表使用起来似乎更简单

–池
17年5月31日在22:39

如果您有可用的:-)有时您甚至在没有尾巴的环境中...那么您可以使用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
17年7月7日在7:17

在答案中,不在评论中。答案可以更新吗?

– Peter Mortensen
20年1月8日在2:44



#8 楼

您也许可以做到:

tail -f /var/log/messages


评论


在大多数系统上,dmesg日志文件只是系统启动完成后dmesg缓冲区的静态转储。之后,任何新的内核消息通常都会进入另一个日志文件,而dmesg文件将保持不变,直到重新引导。

–匿名
2011年5月26日在22:08

我不了解“大多数”系统,但是我管理的GNU Linux系统都没有这种行为。 dmesg报告来自内核的最新最新消息集,通常是特定于硬件子系统的。

–卡莱布
2011年5月27日在7:26

#9 楼

我在/root/.bashrc中使用该别名;从内核3.5.0开始就像dmesg -w一样容易。

#10 楼

怎么样:
dmesg | tail -f /dev/stdin


#11 楼

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

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


#12 楼

在当前的Ubuntu下(我正在使用Ubuntu 12.04(精确的穿山甲)),

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

#13 楼

这可能有用:


dmesg | tail -f-


使用dmesg运算符作为标准输出的快捷方式,通过尾部将-的输出通过管道传输。

评论


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

– pabouk
2014年1月15日在8:39

它不起作用,因为dmesg关闭一次后关闭输出。 tail -f无法再更改此设置。

–丹尼尔·奥尔德(Daniel Alder)
2014年8月25日在7:12

这不起作用-它仅显示最后10行并停止。在Ubuntu 19.10(Eoan Ermine)上试用。

– Peter Mortensen
20年1月8日在2:51