Bagaimana saya bisa melihat output dmesg saat ia berubah?

141

Saya sedang menulis driver perangkat yang mencetak pesan kesalahan ke output dmesg cincin buffer . Saya ingin melihat output dmesgsaat ia berubah.

Bagaimana saya bisa melakukan ini?

Milad Khajavi
sumber
1
superuser.com/questions/289239/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

178

dmesgVersi yang relatif baru memberikan opsi ikuti ( -w, --follow) yang berfungsi secara analog tail -f.

Jadi, cukup gunakan perintah berikut:

$ dmesg -wH

( -H, --humanmemungkinkan fitur yang mudah digunakan seperti warna, waktu relatif)

Opsi-opsi itu tersedia misalnya di Fedora 19.

maxschlepzig
sumber
2
Temuan yang bagus! Gentoo tidak grok -Htetapi sebaliknya
unperson325680
Alat ruang pengguna harus versi 2.22+. Pengguna Ubuntu harus menunggu versi 14.10 "utopis"
Daniel Alder
1
Ubuntu tidak grok -w - perlu menggunakan arloji (di bawah)
Brent Faust
2
Wow jawaban sysadmin yang menggunakan --deskripsikan-bernama-flag alih-alih flag karakter tunggal. BRAVO, SIR. BRAVO.
allyourcode
1
-wharus bekerja di setiap versi Ubuntu dari Utopic (14.10) dan seterusnya. ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory menunjukkan paket Utopic awal adalah untuk 2,20, tetapi mencapai 2,25 pada saat dirilis.)
mwfearnley
54

Anda dapat menggunakan watchperintah yang dimaksudkan persis untuk hal-hal seperti ini

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

yang $((LINES-6))bagian harus membuatnya cocok baik ke terminal Anda.

peterph
sumber
2
Jika Anda menggunakan tanda kutip tunggal alih-alih tanda kutip ganda (atau keluar dari tanda dolar), Anda akan mendapatkan nilai baru $ LINES untuk setiap doa, jadi itu akan menyesuaikan jika Anda mengubah ukuran terminal Anda.
P Ayah
Kutipan tunggal akan menghambat ekspansi variabel. Selain itu, variabel diperluas hanya sekali dalam contoh ini - setelah doa watch. Dengan demikian itu tidak akan benar-benar berubah antara doa dmesg. Seseorang harus menggunakan pembungkus yang akan menanyakan keadaan terminal.
peterph
2
Itulah intinya. Kutipan tunggal melarang ekspansi variabel ketika shell melewati argumen watch, oleh karena itu watch akan mengeksekusi perintah dengan ekspresi variabel di sana, yang akan diperluas oleh shell yang dipanggilnya. Setiap waktu. Cobalah, ini berhasil.
P Ayah
Hmm, Anda benar - saya berasumsi watchmenggunakan popen(), yang berarti shell lain muncul dan variabel lingkungan kemudian dipasok olehnya (dan dengan demikian diperbarui pada setiap eksekusi run). Temuan yang bagus.
peterph
12

Anda tidak dapat benar-benar memonitor output dmesgsecara langsung.

namun, kemungkinan besar modul Anda tidak mencetak langsung ke buffer cincin dmesg, melainkan menggunakan fasilitas logging kernel (yang kemudian akan ditampilkan oleh dmesg). jika Anda syslogmemiliki beberapa pengaturan waras (mis. default), pesan-pesan ini kemungkinan besar juga akan muncul di file kern.loglog.

sehingga Anda dapat melakukan sesuatu seperti:

 tail -f /var/log/kern.log
umläute
sumber
/var/log/kern.logcukup spesifik untuk Linux. Untuk OpenBSD (dan mungkin yang lain), item dmesg akan masuk / var / log / messages. Memang, beberapa hal lain juga ada di sana.
kurtm
2
tail -f /var/log/{messages,kernel,dmesg,syslog}via superuser: is-it-possible-to-tail-f-the-output-of-dmesg
sini
9

Anda menggunakan dmesguntuk mendapatkan pesan log dari kernel.

Kernel itu sendiri login ke buffer cincin, yaitu hanya di memori. Sekarang semua yang dmesgdilakukan adalah mengeluarkan konten buffer cincin itu. Jika Anda melakukannya dmesg -cjuga akan menghapus buffer cincin setelahnya.

Oleh karena itu Anda dapat melakukan sesuatu seperti while true; do dmesg -c; sleep 1; donememiliki sesuatu yang setara dengan yang tidak berfungsi dmesg|tail. Tapi ini menghapus buffer cincin dan karenanya membutuhkan kekuatan root.

Cara lainnya adalah file /proc/kmsgyang memungkinkan tampilan pada buffer cincin. Anda bisa melakukannya tail -f /proc/kmsg, tetapi ini hanya memungkinkan untuk satu proses, dan ini biasanya daemon logging Anda. - Tugasnya adalah membaca pesan dan menulisnya ke file nyata (biasanya di / var / log) di mana mereka dapat dibaca. Ini dapat dikonfigurasi untuk menampilkan semua pesan ke satu file atau bagian yang berbeda menjadi file yang berbeda. (Tetapi konfigurasi tergantung pada daemon logging sistem Anda.)

Oleh karena itu perhatikan /var/logapakah ada file yang sesuai dengan kebutuhan Anda dan konfigurasikan daemon logging Anda sebaliknya.

michas
sumber
//, Pada sistem CEntOS 6 yang saya gunakan, tailing dan viewing / proc / kmsg tidak menghasilkan output. [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
Nathan Basanese
8

Jika Anda menggunakan sistem tertanam, busybox yang umum pada sistem seperti OpenWRT memiliki fungsi yang sangat terbatas dan hanya 2-3 bendera yang didukung.

Jika Anda menginginkan cara cepat dan kotor untuk mencetak keluaran dmesg di layar secara terus-menerus seiring perubahan acara, bash loop sederhana berfungsi dengan baik. Ini tidak ideal tetapi seperti yang saya sebutkan dmesg BusyBox hilang banyak fungsi. Saya menemukan yang berikut ini memiliki efek yang sama ketika dimasukkan ke baris perintah:

$ while true; do dmesg -c ; sleep 1 ; done

Anda dapat keluar dari loop dengan Ctrl-C, sleep 1 adalah untuk menghentikannya menghancurkan CPU dengan sia-sia, dan flag -c menghapus buffer pada setiap panggilan sehingga Anda tidak melihat output berulang setiap detik,

pengguna241342
sumber
1
Sangat berguna untuk debugging android.
val
5

Pada sistem yang menggunakan systemdAnda juga dapat:

# journalctl -kf
Pepatah
sumber
1
Ubuntu 14.10: ➜ ~ journalctl -kf Tidak ditemukan file jurnal.
Nathan Basanese
0

Gunakan 2 perintah ini dari terminal terpisah:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

Ini akan mencapai hasil yang serupa.

K_K
sumber
//, ini pada dasarnya menginstruksikan dmesg untuk menambahkan output ke test.txt, kan? Dan perintah kedua hanya menonton file test.txt itu?
Nathan Basanese
Terima kasih .. ya .. perintah ke-2 mengawasi perubahan ke dmesg. cat / proc / kmsg dapat mencapai hasil yang serupa tetapi tidak menyimpan log ke file.
K_K