「dmesg」の出力を「tail -f」にすることは可能ですか?


137

のような何かをしたい

dmesg | tail -f

しかし、それは機能しません。出力を監視する代わりに、尾を終了させることにより、Mac OSX 10.6.7を使用します。

それを行う方法、または同等のコマンドがあるのだろうか。PS、whileループが十分に良いアイデアになるとは思わない。


それは私のUbuntu 10.04LTSボックスで正常に動作します。回避策は、syslogがカーネルメッセージを入れているログファイルをすべてテーリングすることです。

4
Mac OSXでは、そのファイルは/var/log/kernel.logです

1
@Anonymous 2:残念ながら、にkernel.logは同じ出力が含​​まれていませんdmesg。例えば、損傷したドライブのファイルがでエラー読みdmesgながら、読み取ることができませんでしたファイルを正確に指定kernel.log:残念ながら、唯一のより少なくより便利予告提供disk0s2: I/O error.
イワンVučica

3
Linux 3.5以降では、dmesg -wを実行できます。
ダグリチャードソン14

回答:


120

おそらく、さまざまなログファイルからのメッセージの組み合わせを探しています。試してください:

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

…システムのかなり良い概要を得るため。それ以上またはそれ以下が必要な場合は、表示するメッセージがどのログファイルに配置されているかを調べます。

また、使用multitailしてファイルとカラーコードを調べ、複数のログファイルを一度にフィルタリングします。

編集:これに答えたとき、これはあまり関連していませんでしたが、このページが多くのヒットを得るので、systemdを実行している新しいシステムがこれを持っていることに言及する価値があると思います。

dmesg -w

5
ヘッズアップre:ありがとうmultitail。面白そうです。OS Xの場合、次のようになりますtail -f /var/log/{system.log,kernel.log}
-boehj

2
system.logそして、kernel.logの正確な出力を含まないdmesg例えばOS X上を、損傷したドライブのために、ファイルがでエラー読みdmesgながら、読み取ることができませんでしたファイルを正確に指定するkernel.log:残念ながら唯一のあまり、より便利予告提供disk0s2: I/O error.
イワンVučica

3
記録上、この回答はOS X Mavericks(10.9)またはArch Linuxでは機能しません。
エルマンディ

@Dan Archでは、syslogデーモンがインストールされていないか、サービスが有効になっていない可能性があります。基本的なパッケージセットの一部ではないことに気づきました。OSXはBSDベースであり、多くのものに対して異なるパスを持っています。システムがロギングと調整を処理する方法と場所を把握する必要があります。私の答えはかなり一般的で、syslogが有効になっているほとんどのFHSベースのディストリビューションをカバーしていますが、多くのバリアント実装もあります。
カレブ

1
編集時の++。
プスタントン

56

@#$%ingを機能させるだけです

  1. dmesgの出力を、絶えず、すぐに印刷したい
  2. Dmesgはカーネルリングバッファーを出力しています(を参照man dmesg
  3. カーネルリングバッファーは特別なprocファイルです/proc/kmsg(を参照man proc
  4. /proc/kmsg直接読む、すなわちcat /proc/kmsg

さて、親しみやすいprocマニュアルを読むと、一度に1人のユーザー(特権が必要)のみが読めるように厳しく警告します/proc/kmsg。syslogの実装が何であれ、これを行う必要があり、おそらくで動作しdmesgます。私は知らない、私はここで私のリーグから外れている、ただマニュアルを言い換えている。したがって、これは「@#$%ingを機能させる」方法ですが、最初に次のいくつかの方法を検討してください。

承認されたマニュアルページ:watch + dmesg

systemd init *を使用したArch gnu / linuxでは、dmesg.logは頻繁に書き込まれません。おそらくまったく書き込まれませんか?カーネルログバッファーを継続的に読み取る最良の方法は、を使用することwatchです。このような何かがあなたを始めるはずです(あなたの端末に合う行数を調整してください):

watch 'dmesg | tail -50'

watch + dmesg + daemon + tail -f

より複雑なソリューションでは、watchを使用してdmesg出力をファイルに書き込むことができますtail -f。おそらくこれをデーモンとして実行したいでしょう。適切なデーモンは、ログをgzipおよびローテーションします。次のbashコードはテストされておらず、機能しておらず、アイデアを伝えることのみを目的としています。@Brooks Mosesの答えには動作バージョンがあります。

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

*接線、これはosxの質問ですが、systemdが存在する場合は、気にしないでください(前の100行も表示するためにw / をdmesg使用することもできます)journalctl -xf-n 100


1
OS Xにはがありませんが/proc、答えの残りは適用可能です。watchMacPortsからインストールできます:macports.org
IvanVučica11年

@IvanVučicaああ、知って良かった。OSXがカーネルリングバッファを表すのは不思議です
。– djeikyb

2
カーネルメモリに直接あるように見えます。Appleのdmesg実装のソースコード:opensource.apple.com/source/system_cmds/system_cmds-230.7/…Quick Googlingは、ファイルシステムに表示されることについて何も言及していません:/
IvanVučica11年

42

カーネルカーネル3.5.0以降のLinuxに興味がある人向け:

# dmesg -w

また、systemdあなたができるシステムでは:

# journalctl -kf

6
dmesg -w絶対に素晴らしい解決策です。残念ながら、Ubuntu 14.04でさえ、ユーザースペースツールがまだサポートしていないため、この準備ができていないようです。
ダニエルアルダー14

1
この答えは間違いなく今より多くの賛成に値する。
m4tx

2
はい、これは素敵な小さなナゲットです。dmesg -wH
faustus

21

以下は、djeikybの回答のバリエーションで、実際にテストされており、いくつかのバグを修正しています。

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

重要なトリックは、dmesg -c印刷後にリングバッファをクリアするということです。つまり、毎回、前回から新しいことだけを印刷しています。そのためには、rootになる必要がありますsudo。バグ修正もあります。出力をファイルにダンプしてテールにパイプすることはできませんが(これは機能しません)、新しく書き込まれたファイルから読み取ります。

dmesg > /tmp/dmesg.log反復するたびにファイル全体を上書きすることもできますが、これは大量のI / Oであり、上書き中にコンピューターがクラッシュした場合にファイルを失うリスクもあります。

また、永久にtail -f実行されるwhileループを使用して、より密接に似た何かを行うこともできます(Ben Harrisの答えを参照)。ただし、これは実際には実行中のカーネルメッセージバッファーをクリアするため、後で必要に応じてログファイルにパイプすることもできます。dmesg -csleep 1


6

これはあなたのために働くかもしれません

while true;do sudo dmesg -c;done

'-c'フラグはメッセージバッファを標準出力にクリアすることに注意してください。rootの場合、「sudo」は不要です。これがCPUリソースを過剰に消費していると思われる場合は、ループが完了する前に「スリープ1」を追加してみてください。


常に画面を見ている場合は、時計が良いかもしれません
セスロバートソン

2
ソースを自由に引用してください:linuxforums.org/forum/applications/…–

2
早くて汚い。あなたがこれをしている唯一のユーザーである場合にのみ機能するため、汚れています。それ以外の場合、各ユーザーはメッセージの半分のみを取得します
ダニエルアルダー

私のアンドロイドadbの問題を解決します。
パントイン

5

この投稿を見る前にこれをしました:

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

あなたができるかもしれない:

tail -f /var/log/messages

2
ほとんどのシステムでは、dmesgログファイルは、システムの起動が完了した後のdmesgバッファーの静的なダンプにすぎません。その後、通常、新しいカーネルメッセージは別のログファイルに記録され、dmesgファイルは再起動するまで変更されません。

7
「ほとんどの」システムについては知りませんが、私が管理しているGNU Linuxシステムはそのように動作しません。dmesg通常、ハードウェアサブシステムに固有の、カーネルからの最新のメッセージの現在のセットを報告します。
カレブ

3

while dmesg -c >> /tmp/dmesg.log; 0.1眠ります; 完了&tail -f /tmp/dmesg.log


これが解決策である理由を説明してください。
ChrisF

これは、一部のディストリビューションが舞台裏で行うことです。カーネルリングバッファをポーリングし、バックグラウンドジョブで0.1秒ごとに/tmp/dmesg.logにログを記録し、その出力を追跡します。また、バックグラウンドで特別な何かを実行していない場合、またはすべてのバックグラウンドプロセスとサービスを強制終了し、緊急トラブルシューティングを実行している場合に機能する唯一の方法です。
ダジェフ

1
使用する方が簡単なようですwatch
-poolie

それが利用できる場合:-)時々、あなたは尾さえない環境にいます...そして、あなたはcat /tmp/dmesg.logを使うことができます、またはddさえも...書くことができないなら/ tmpにマウントし、-t tmpfs-/ tmp、またはramfsをマウントできない、または/ dev / shm / ...に書き込むことができない場合、dmesg -cの間にちょうどできます。睡眠0.1; echo> / dev / null; dmesg -cの間だけ、スリープ状態になっていない場合は完了です。echo> / dev / null; 完了; 時にはあなたも、あなただけの* :-Dエコーん... LSはありません
Dagelf

2

このエイリアスは/root/.bashrcで使用します。

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

これはdmesgに続き、呼び出された端末の行を調整します。


0

現在のUbuntu(私はUbuntu 12.04を使用しています)では、

tail -f /var/log/syslog

要件を満たすことができます。


0

このコードを使用して特別なカーネルイベントを探し、それを「コールバック」プロセスにパイプしました。

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

-2

古い質問への応答ですが、誰かがそれを役に立つと思うかもしれません:)

dmesg | 尾-f-

-演算子をstdoutへのショートカットとして使用して、dmesgの出力をtailにパイプします。


2
これは質問からのコードで、動作しません。
pabouk 14年

2
dmesg一度閉じた後に出力を閉じるため、機能しません。tail -fこれはもう変更できません。
ダニエルアルダー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.