dmesg | tail -f
的操作,但是它不起作用:
我使用的是Mac OS X v10.6.7(雪豹) 。这样,
tail
将退出,而不是监视输出。我想知道是否有一种方法或等效命令。
PS,我不知道认为
while
循环将是一个好主意。#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 -c
和sudo
的dmesg > /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
评论
在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”。