題 有可能`tail -f`輸出`dmesg`嗎?


想做點什麼

dmesg | tail -f

但它不起作用: 我使用Mac OSX 10.6.7,通過這樣做尾部將退出,而不是監視輸出。

我想知道是否有任何辦法,或任何等效的命令。 P.S.,我不認為 while 循環將是一個足夠好的想法。


123
2018-05-26 21:55


起源


這在我的Ubuntu 10.04LTS盒子上工作正常。解決方法是關閉syslog將內核消息放入的任何日誌文件。
在Mac OSX上,該文件是/var/log/kernel.log
@Marc抱歉,我現在添加了我的機器規格。 @bobDevil這很酷,但似乎輸出與dmesg不同。然而,這個看起來更好 - Ivan Z. G. Xiao
從linux 3.5開始,你可以做dmesg -w。 - Doug Richardson
unix.stackexchange.com/questions/95842/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


您可能正在尋找來自各種日誌文件的一些消息組合。嘗試:

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

...以獲得對系統的非常好的概述。如果您想要更多或更少,請研究您要查看的郵件所在的日誌文件。

另外看看使用 multitail 一次歸檔和顏色代碼並過濾多個日誌文件。

編輯: 當我回答這個問題時,這並不是很相關,但是當這個頁面得到很多點擊時,我認為值得一提的是運行systemd的新系統有這個。

dmesg -w

106
2018-05-26 22:04



謝謝你的單挑: multitail。看起來很有趣在OS X的情況下,它將是這樣的: tail -f /var/log/{system.log,kernel.log}。 - boehj
system.log 和 kernel.log 不包含確切的輸出 dmesg 在OS X上。例如,對於損壞的驅動器,文件讀取錯誤 dmesg 準確指定無法讀取哪個文件,而 kernel.log 遺憾的是,它只提供了不太有用的通知: disk0s2: I/O error. - Ivan Vučica
為了記錄,這個答案不適用於OS X Mavericks(10.9)或Arch Linux。 - Elle Mundy
@Dan On Arch你可能沒有安裝syslog守護進程或啟用了它的服務。我注意到它不是基本包集的一部分,儘管它非常基礎。 OSX是基於BSD的,並且有許多不同的路徑。您需要弄清楚系統處理日誌和調整的方式和位置。我的答案非常通用,涵蓋了大多數啟用了syslog的基於FHS的發行版,但也有很多變體實現。 - Caleb
編輯上的++。 - pstanton


只需將它作為#$%%的工作

  1. 您想要立即不斷地打印dmesg的輸出
  2. Dmesg正在打印內核環緩衝區(參見 man dmesg
  3. 內核環緩衝區是一個特殊的proc文件, /proc/kmsg (看到 man proc
  4. /proc/kmsg 直接,即 cat /proc/kmsg

現在,如果您閱讀友好的proc手冊,它會嚴厲警告您只允許一個用戶(必須有特權)閱讀 /proc/kmsg 一次。無論你有什麼系統日誌實現都應該這樣做,並且可能它適用 dmesg。我不知道,我離開了我的聯盟,只是解釋了手冊。因此,雖然這是“只是讓它以#$%工作”的方式,但首先考慮接下來的幾種方法。

手冊頁批准:觀看+ dmesg

在帶有systemd init *的Arch gnu / linux上,dmesg.log不是經常寫的,也許根本不寫?我發現連續讀取內核日誌緩衝區的最佳方法是 watch。這樣的事情應該讓你開始(調整你的終端適合多少行):

watch 'dmesg | tail -50'

看+ dmesg +守護進程+尾巴-f

更複雜的解決方案可能會使用watch將dmesg輸出寫入文件,然後您可以使用 tail -f。您可能希望將其作為守護程序運行。一個合適的守護進程也會gzip和旋轉日誌。以下bash代碼未經測試,不工作,僅用於表達想法。 @Brooks摩西的答案有一個 工作版

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

*切線,因為這是一個osx問題,但是當系統出現時,請不要理會 dmesg, 使用 journalctl -xf (也許w / -n 100 也顯示前100行)


52
2018-06-11 22:42



OS X沒有 /proc但是你的其餘部分是適用的。 watch 可以從MacPorts安裝: macports.org - Ivan Vučica
@IvanVučica啊,很高興知道。不知道OSX代表內核環緩衝區.. - djeikyb
看起來它直接在內核內存中。 Apple的源代碼 dmesg 執行: opensource.apple.com/source/system_cmds/system_cmds-230.7/... 快速谷歌搜索沒有提到它在文件系統中的任何表示:/ - Ivan Vučica


對於那些對linux感興趣的人,因為內核內核3.5.0:

# dmesg -w

也在系統上 systemd 您可以:

# journalctl -kf

36
2018-03-28 14:27



dmesg -w是絕對最好的解決方案。不幸的是,即使Ubuntu 14.04似乎也沒有為此做好準備,因為用戶空間工具尚不支持它。 - Daniel Alder
這個答案肯定值得更多的讚成。 - m4tx
是的,這是一個不錯的小金塊。可以通過以下方式使人類可讀:dmesg -wH - faustus


這是djeikyb的答案的一個變種,實際上已經過測試,並修復了一些錯誤。

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

重要的訣竅在於我們正在做的事情 dmesg -c,它打印後清除環形緩衝區 - 因此,每次通過我們只打印自上次以來的新內容。你需要做根,才能這樣做 sudo。還有一個錯誤修正;而不是試圖將輸出轉儲到文件並將其傳遞給尾部(這不起作用),我們只是從新寫入的文件中讀取。

我們可以做到 dmesg > /tmp/dmesg.log 並且每次迭代都會覆蓋整個文件,但是如果計算機在覆蓋過程中崩潰,那麼這就是很多I / O並且還有丟失文件的風險。

你也可以做類似的事情 tail -f 使用while循環執行 dmesg -c 和 sleep 1 永遠(見本哈里斯的回答)。但是,由於這實際上是在運行時清除內核消息緩衝區,因此您可能還希望將內容管道傳輸到日誌文件中以備日後使用。


21
2017-07-20 21:45





這可能對你有用

while true;do sudo dmesg -c;done

請記住,' - c'標誌將消息緩衝區清除為stdout。如果你是root的話,'sudo'是不必要的。如果您覺得這會佔用過多的CPU資源,請在循環完成之前嘗試添加“sleep 1”。


6
2018-05-26 22:05



如果你一直在看屏幕,手錶可能會很好 - Seth Robertson
隨意引用您的來源: linuxforums.org/forum/applications/...
又髒又髒。很髒,因為只有你是唯一一個這樣做的用戶才有效。否則每個用戶只獲得一半的消息 - Daniel Alder
解決了我的Android adb問題。 - PAntoine


在看到這篇文章之前這樣做了:

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

5
2017-11-05 13:45





你可以做到:

tail -f /var/log/messages

3
2018-05-26 22:01



在大多數係統上,dmesg日誌文件只是系統引導完成後dmesg緩衝區的靜態轉儲。之後,任何新的內核消息通常會進入另一個日誌文件,dmesg文件將保持不變,直到重新啟動。
我不知道“大多數”系統,但我管理的GNU Linux系統都沒有這種方式。 dmesg 報告來自內核的當前最新消息集,通常特定於硬件子系統。 - Caleb


而dmesg -c >> /tmp/dmesg.log;睡覺0.1;完成&tail -f /tmp/dmesg.log


3
2018-03-05 08:26



請你能解釋為什麼這是一個解決方案。 - ChrisF
這是一些發行版在幕後做的事情。它輪詢內核ringbuffer並在後台作業中每隔0.1秒將其記錄到/tmp/dmesg.log,同時將其輸出結尾。此外,如果您沒有在後台運行某些特殊功能,或者您已經殺死所有後台進程和服務並且您正在進行緊急故障排除,那麼這是唯一可行的方法。 - Dagelf
似乎更簡單易用 watch - poolie
如果你有它:-)有時你在一個你甚至沒有尾巴的環境......然後你可以使用cat /tmp/dmesg.log,或dd甚至......如果你不能寫到/ tmp,並且無法掛載-t tmpfs - / tmp,或者ramfs,或者寫入/ dev / shm / ...那麼你可以只在dmesg -c;睡眠0.1; do echo> / dev / null;完成,如果你沒有睡覺,就在dmesg -c; do echo> / dev / null;完成;有時你甚至沒有...然後你只是迴聲* :-D - Dagelf


我在/root/.bashrc中使用這個別名;

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

它遵循dmesg並調整它所調用的終端的行。


2
2018-02-04 09:16





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

tail -f /var/log/syslog

可以滿足要求。


0
2017-12-17 04:37