のようなことをしたい
dmesg | tail -f
私はMac OSX 10.6.7を使っていますが、出力を監視するのではなく、末尾が終了するようにしています。
それを実行する方法、または同等のコマンドがあるかどうか私は疑問に思います。 P.S、私はwhile
ループが十分に良い考えになるとは思わない。
おそらく、さまざまなログファイルからのメッセージの組み合わせを探しています。試してください:
tail -f /var/log/{messages,kernel,dmesg,syslog}
…システムのかなり良い概観を得るために。それよりも多い、または少ない場合は、表示したいメッセージがどのログファイルに配置されているかを調べます。
また、multitail
を使ってファイルや色分けをしたり、複数のログファイルを一度にフィルター処理したりすることも検討してください。
編集:これに答えてもあまり意味がありませんでしたが、このページに多くのヒットがあるので、新しいシステムに言及する価値があると思います実行systemdはこれを持っています。
dmesg -w
man dmesg
を参照)/proc/kmsg
です(man proc
を参照)/proc/kmsg
、すなわちcat /proc/kmsg
を読んでください。さて、あなたが親切なprocマニュアルを読むなら、それは厳しく一人のユーザ(特権を持っていなければならない)だけが一度に/proc/kmsg
を読めるようにあなたに警告するでしょう。どんなsyslogの実装でもこれをするべきです、そしておそらくそれはdmesg
で動作します。私は知らない、私はここで私のリーグの外にいる、ただマニュアルを言い換えている。ですから、これは "@ @ $%ingを動作させる"方法ですが、最初に次の2つの方法を検討してください。
Systemd init *を備えたArch gnu/linuxでは、dmesg.logはあまり頻繁には書き込まれません、おそらくまったく書き込まれないでしょうか。カーネルログバッファを継続的に読み取ることが最も良い方法はwatch
です。こんな感じで始めましょう(端末に何行入るかを調整してください):
watch 'dmesg | tail -50'
もっと複雑な解決策としては、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
)
Linuxに興味がある人のために、カーネルkernel 3.5.0以降:
# dmesg -w
systemd
を持つシステムでも次のことができます。
# journalctl -kf
これは実際にテストされた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
とdmesg -c
を永遠に実行するwhileループを使って、sleep 1
のようなもっと似たようなことをすることもできます(Ben Harrisの答えを参照)。しかし、これは実際には実行中のカーネルメッセージバッファをクリアしているので、後で必要になった場合に備えて、それらをログファイルにパイプ処理することをお勧めします。
これはあなたのために働くかもしれません
while true;do Sudo dmesg -c;done
'-c'フラグはメッセージバッファを標準出力にクリアすることに注意してください。あなたがrootであれば、 'Sudo'は不要です。これがCPUリソースを大量に消費していると感じる場合は、ループが完了する前に 'sleep 1'を追加してみてください。
この記事を見る前にこれをしました:
#!/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;
dmesg -c >> /tmp/dmesg.log; 0.1をスリープさせます。 done&tail -f /tmp/dmesg.log
あなたができるかもしれません:
tail -f /var/log/messages
私は/root/.bashrcでこのエイリアスを使います。
alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'
これはdmesgに続き、それが呼び出されたどの端末にも行を調整します。
このコードを使って特別なカーネルイベントを探し、それを "コールバック"プロセスにパイプしました。
while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered -o $pattern \
| ...
現在のUbuntu(私はUbuntu 12.04を使用しています)の下で、
tail -f /var/log/syslog
要件を満たすことができます。