Apakah mungkin untuk `tail -f` output dari` dmesg`?

137

Ingin melakukan sesuatu seperti

dmesg | tail -f

tetapi tidak berhasil: Saya menggunakan Mac OSX 10.6.7, dengan melakukan itu ekornya akan keluar, alih-alih memantau hasilnya.

Saya ingin tahu apakah ada cara untuk melakukannya, atau perintah yang setara. PS, saya tidak berpikir whileloop akan menjadi ide yang cukup bagus.

Ivan ZG Xiao
sumber
yang berfungsi dengan baik di kotak Ubuntu 10.04LTS saya. Solusinya adalah dengan mengekor logfile apa pun yang syslog masukkan ke dalam pesan kernel.
4
Di Mac OSX, file itu adalah /var/log/kernel.log
1
@ Anonim 2: Sayangnya, kernel.logtidak mengandung output yang sama dengan dmesg. Misalnya, untuk drive yang rusak, kesalahan pembacaan file di dmesgtentukan dengan pasti file mana yang tidak dapat dibaca, sementara kernel.logsayangnya hanya memberikan pemberitahuan yang kurang bermanfaat:disk0s2: I/O error.
Ivan Vučica
3
Sejak linux 3.5, Anda dapat melakukan dmesg -w.
Doug Richardson
2
unix.stackexchange.com/questions/95842/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

120

Anda mungkin mencari beberapa kombinasi pesan dari berbagai file log. Mencoba:

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

... untuk mendapatkan gambaran umum sistem yang cukup bagus. Jika Anda ingin lebih atau kurang dari itu, teliti file log apa yang ingin Anda lihat.

Lihat juga menggunakan multitailfile dan kode warna dan filter beberapa file log sekaligus.

Sunting: Ini tidak terlalu relevan ketika saya menjawab ini, tetapi karena halaman ini mendapatkan banyak hit saya pikir itu layak menyebutkan bahwa sistem yang lebih baru menjalankan systemd memilikinya.

dmesg -w
Caleb
sumber
5
Terima kasih atas kepala-up re: multitail. Terlihat menarik. Dalam kasus OS X itu akan menjadi sesuatu seperti: tail -f /var/log/{system.log,kernel.log}.
boehj
2
system.logdan kernel.logtidak mengandung output persis dmesgpada OS X. Misalnya, untuk drive yang rusak, kesalahan pembacaan file dmesgmenentukan secara pasti file mana yang tidak dapat dibaca, sementara kernel.logsayangnya hanya memberikan pemberitahuan yang kurang bermanfaat:disk0s2: I/O error.
Ivan Vučica
3
Sebagai catatan, jawaban ini tidak berfungsi pada OS X Mavericks (10.9) atau Arch Linux.
Elle Mundy
@Dan Pada Arch Anda mungkin tidak memiliki daemon syslog diinstal atau layanannya diaktifkan. Saya perhatikan bahwa itu bukan bagian dari paket dasar yang ditetapkan meskipun itu cukup mendasar. OSX berbasis BSD dan memiliki jalur berbeda untuk banyak hal. Anda harus mengetahui bagaimana dan di mana sistem Anda menangani pencatatan dan penyesuaian. Jawaban saya cukup umum dan mencakup sebagian besar distro berbasis FHS dengan syslog diaktifkan, tetapi ada juga banyak varian implementasi.
Caleb
1
++ pada hasil edit.
pstanton
56

Jadikan @ # $% sebagai pekerjaan

  1. Anda ingin mencetak output dmesg, terus-menerus, segera
  2. Dmesg sedang mencetak buffer cincin kernel (lihat man dmesg)
  3. Buffer cincin kernel adalah file proc khusus, /proc/kmsg(lihat man proc)
  4. Baca /proc/kmsglangsung, yaitu cat /proc/kmsg.

Sekarang, jika Anda membaca manual proc ramah, itu akan memperingatkan Anda untuk membiarkan hanya satu pengguna (yang harus memiliki hak istimewa) membaca /proc/kmsgsekaligus. Apa pun implementasi syslog yang Anda miliki harus melakukan ini, dan mungkin berhasil dmesg. Saya tidak tahu, saya keluar dari liga saya di sini, hanya mengutip manual. Jadi sementara ini adalah cara "hanya membuatnya @ # $% ing bekerja", pertimbangkan metode pasangan berikutnya terlebih dahulu.

Halaman manual disetujui: watch + dmesg

Pada Arch gnu / linux dengan systemd init *, dmesg.log tidak terlalu sering ditulis, mungkin tidak sama sekali? Cara terbaik yang saya temukan untuk membaca buffer log kernel terus menerus adalah dengan watch. Sesuatu seperti ini harus Anda mulai (sesuaikan untuk berapa banyak baris yang pas di terminal Anda):

watch 'dmesg | tail -50'

lihat + dmesg + daemon + tail -f

Solusi yang lebih berbelit-belit mungkin menggunakan arloji untuk menulis output dmesg ke file, yang Anda bisa kemudian tail -f. Anda mungkin ingin menjalankan ini sebagai daemon. Daemon yang tepat juga akan gzip dan memutar log. Kode bash berikut tidak teruji, tidak berfungsi, dan hanya dimaksudkan untuk menyampaikan gagasan. @ Brian jawaban Musa memiliki versi yang berfungsi .

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

* tangen, karena ini adalah pertanyaan osx, tetapi ketika systemd ada, jangan repot-repot dmesg, gunakan journalctl -xf(mungkin -n 100juga menampilkan 100 baris sebelumnya)

djeikyb
sumber
1
OS X tidak memiliki /proc, namun sisa jawaban Anda berlaku. watchdapat diinstal dari MacPorts: macports.org
Ivan Vučica
@Ivan Vučica Ah, senang tahu. Bertanya-tanya di mana OSX mewakili buffer cincin kernel ..
djeikyb
2
Sepertinya itu langsung di memori kernel. Kode sumber untuk dmesgimplementasi Apple : opensource.apple.com/source/system_cmds/system_cmds-230.7/... Quick Googling tidak menyebutkan apa-apa tentang hal itu yang diwakili dalam sistem file: /
Ivan Vučica
42

Bagi yang tertarik dengan linux, karena kernel 3.5.0:

# dmesg -w

Juga pada sistem dengan systemdAnda dapat:

# journalctl -kf
Pepatah
sumber
6
dmesg -wadalah solusi terbaik. Sayangnya, bahkan Ubuntu 14.04 sepertinya tidak siap untuk ini karena alat ruang pengguna belum mendukungnya.
Daniel Alder
1
Jawaban ini jelas layak mendapatkan lebih banyak upvotes sekarang.
m4tx
2
ya, ini adalah nugget kecil yang menyenangkan. dapat dibuat manusia dapat dibaca dengan: dmesg -wH
Faustus
21

Berikut varian jawaban djeikyb yang benar-benar diuji, dan memperbaiki beberapa bug.

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

Trik penting adalah yang kami lakukan dmesg -c, yang membersihkan buffer cincin setelah dicetak - dengan demikian, setiap kali kami hanya mencetak apa yang baru sejak terakhir kali. Anda harus menjadi root untuk melakukan itu, dengan demikian sudo. Ada juga perbaikan bug; alih-alih mencoba untuk membuang output ke file dan pipa ke tail (yang tidak berfungsi), kami hanya membaca dari file yang baru ditulis.

Kita bisa melakukan adil dmesg > /tmp/dmesg.logdan menimpa seluruh file setiap iterasi, tapi itu banyak I / O dan juga berisiko kehilangan file jika komputer crash di tengah-tengah overwrite.

Anda juga bisa melakukan hal serupa yang lebih dekat seperti tail -fdengan loop sementara yang dijalankan dmesg -cdan sleep 1selamanya (lihat jawaban Ben Harris). Namun, karena ini benar-benar membersihkan buffer pesan kernel ketika sedang berjalan, Anda mungkin juga ingin menyalurkan berbagai hal ke dalam file log jika Anda menginginkannya nanti.

Brooks Moses
sumber
6

Ini mungkin bekerja untuk Anda

while true;do sudo dmesg -c;done

Perlu diingat bahwa flag '-c' membersihkan buffer pesan ke stdout. 'Sudo' tidak perlu jika Anda root. Jika Anda merasa ini memakan terlalu banyak sumber daya CPU Anda, coba tambahkan 'sleep 1' sebelum loop selesai.


sumber
menonton mungkin baik di sana, jika Anda menonton layar sepanjang waktu
Seth Robertson
2
Jangan ragu mengutip sumber-sumber Anda: linuxforums.org/forum/applications/…
2
Cepat dan kotor. Kotor karena hanya berfungsi jika Anda adalah satu-satunya pengguna yang melakukan ini. Kalau tidak, setiap pengguna hanya mendapat setengah dari pesan
Daniel Alder
Memecahkan masalah adb android saya.
PAntoine
5

Apakah ini sebelum melihat posting ini:

#!/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;
Mekanika Kuantum
sumber
3

Anda mungkin dapat melakukan:

tail -f /var/log/messages
Ed L
sumber
2
Pada kebanyakan sistem, file log dmesg hanyalah dump statis dari buffer dmesg setelah boot sistem selesai. Setelah itu, setiap pesan kernel baru biasanya masuk ke file log lain dan file dmesg akan tetap tidak berubah sampai reboot.
7
Saya tidak tahu tentang sistem "kebanyakan", tetapi tidak ada sistem GNU Linux yang saya admin berperilaku seperti itu. dmesgmelaporkan serangkaian pesan terbaru terkini dari kernel, biasanya khusus untuk subsistem perangkat keras.
Caleb
3

sementara dmesg -c >> /tmp/dmesg.log; tidur 0,1; dilakukan & tail -f /tmp/dmesg.log

Dagelf
sumber
Tolong bisakah Anda menjelaskan mengapa ini solusi.
ChrisF
Itulah yang dilakukan beberapa distribusi di belakang layar. Itu polling kernel ringbuffer dan mencatatnya ke /tmp/dmesg.log setiap 0,1 detik dalam pekerjaan latar belakang sementara itu membuntuti output itu. Juga, itu satu-satunya metode yang akan bekerja jika Anda tidak memiliki sesuatu yang berjalan khusus di latar belakang - atau jika Anda telah membunuh semua proses dan layanan latar belakang dan Anda melakukan pemecahan masalah darurat.
Dagelf
1
Tampaknya lebih mudah digunakanwatch
poolie
Jika Anda memilikinya tersedia :-) kadang-kadang Anda berada di lingkungan di mana Anda bahkan tidak memiliki ekor ... maka Anda dapat menggunakan cat /tmp/dmesg.log, atau bahkan ... Jika Anda tidak dapat menulis ke / tmp, dan tidak bisa me-mount tmpfs - / tmp, atau ramfs, atau menulis ke / dev / shm / ... maka Anda bisa sambil dmesg -c; tidur 0,1; lakukan echo> / dev / null; selesai, jika Anda tidak tidur, hanya sementara dmesg -c; lakukan echo> / dev / null; Selesai; Kadang-kadang Anda bahkan tidak punya ls ... maka Anda hanya melakukan gema * :-D
Dagelf
2

Saya menggunakan alias ini di /root/.bashrc;

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

yang mengikuti dmesg dan menyesuaikan garis untuk terminal apa pun namanya.

drgibbon
sumber
0

Di bawah Ubuntu saat ini (saya menggunakan Ubuntu 12,04),

tail -f /var/log/syslog

dapat memenuhi persyaratan.

Bill Zhao
sumber
0

Saya menggunakan kode ini untuk mencari acara kernel khusus dan mengirimkannya ke proses "panggilan balik":

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

menanggapi pertanyaan lama, tetapi seseorang mungkin merasa berguna :)

dmesg | ekor -f -

pipa keluaran dmesg melalui ekor menggunakan - operator sebagai jalan pintas ke stdout

Linux Dood acak
sumber
2
Ini adalah kode dari pertanyaan yang tidak berfungsi.
pabouk
2
Tidak berfungsi karena dmesgmenutup output setelah menutup sekali. tail -ftidak bisa mengubahnya lagi.
Daniel Alder