web-dev-qa-db-ja.com

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

のようなことをしたい

dmesg | tail -f

私はMac OSX 10.6.7を使っていますが、出力を監視するのではなく、末尾が終了するようにしています。

それを実行する方法、または同等のコマンドがあるかどうか私は疑問に思います。 P.S、私はwhileループが十分に良い考えになるとは思わない。

133
Ivan Z. G. Xiao

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

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

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

また、multitailを使ってファイルや色分けをしたり、複数のログファイルを一度にフィルター処理したりすることも検討してください。

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

dmesg -w
114
Caleb

それを@#$%動作中にするだけです

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

さて、あなたが親切なprocマニュアルを読むなら、それは厳しく一人のユーザ(特権を持っていなければならない)だけが一度に/proc/kmsgを読めるようにあなたに警告するでしょう。どんなsyslogの実装でもこれをするべきです、そしておそらくそれはdmesgで動作します。私は知らない、私はここで私のリーグの外にいる、ただマニュアルを言い換えている。ですから、これは "@ @ $%ingを動作させる"方法ですが、最初に次の2つの方法を検討してください。

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

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

watch 'dmesg | tail -50'

watch + dmesg + daemon + tail -f

もっと複雑な解決策としては、watchを使ってdmesgの出力をfileに書き出し、それをtail -fにすることができます。おそらくこれをデーモンとして実行したいでしょう。適切なデーモンもログをgzipしてローテーションします。次のbashコードはテストされていない、機能していない、そしてアイデアを伝えることだけを意図しています。 @Brooks Mosesの答えは 実用版 を持っています。

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

* tangent、これはosxの質問ですが、systemdが出回っているときは、dmesgを気にしないで、journalctl -xfを使用してください(前の100行も表示するには、おそらくw/-n 100

55
djeikyb

Linuxに興味がある人のために、カーネルkernel 3.5.0以降:

# dmesg -w

systemdを持つシステムでも次のことができます。

# journalctl -kf
41
Maxim

これは実際にテストされた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 -fdmesg -cを永遠に実行するwhileループを使って、sleep 1のようなもっと似たようなことをすることもできます(Ben Harrisの答えを参照)。しかし、これは実際には実行中のカーネルメッセージバッファをクリアしているので、後で必要になった場合に備えて、それらをログファイルにパイプ処理することをお勧めします。

21
Brooks Moses

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

while true;do Sudo dmesg -c;done

'-c'フラグはメッセージバッファを標準出力にクリアすることに注意してください。あなたがrootであれば、 'Sudo'は不要です。これがCPUリソースを大量に消費していると感じる場合は、ループが完了する前に 'sleep 1'を追加してみてください。

6
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;
5

dmesg -c >> /tmp/dmesg.log; 0.1をスリープさせます。 done&tail -f /tmp/dmesg.log

3
Dagelf

あなたができるかもしれません:

tail -f /var/log/messages
3
Ed L

私は/root/.bashrcでこのエイリアスを使います。

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

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

2
drgibbon

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

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

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

tail -f /var/log/syslog

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

0
Bill Zhao