Saya sedang menulis driver perangkat yang mencetak pesan kesalahan ke output dmesg cincin buffer . Saya ingin melihat output dmesg
saat ia berubah.
Bagaimana saya bisa melakukan ini?
linux
command-line
logs
dmesg
Milad Khajavi
sumber
sumber
Jawaban:
dmesg
Versi yang relatif baru memberikan opsi ikuti (-w
,--follow
) yang berfungsi secara analogtail -f
.Jadi, cukup gunakan perintah berikut:
(
-H
,--human
memungkinkan fitur yang mudah digunakan seperti warna, waktu relatif)Opsi-opsi itu tersedia misalnya di Fedora 19.
sumber
-H
tetapi sebaliknya-w
harus 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.)Anda dapat menggunakan
watch
perintah yang dimaksudkan persis untuk hal-hal seperti iniyang
$((LINES-6))
bagian harus membuatnya cocok baik ke terminal Anda.sumber
watch
. Dengan demikian itu tidak akan benar-benar berubah antara doadmesg
. Seseorang harus menggunakan pembungkus yang akan menanyakan keadaan terminal.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.watch
menggunakanpopen()
, yang berarti shell lain muncul dan variabel lingkungan kemudian dipasok olehnya (dan dengan demikian diperbarui pada setiap eksekusi run). Temuan yang bagus.Anda tidak dapat benar-benar memonitor output
dmesg
secara 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 Andasyslog
memiliki beberapa pengaturan waras (mis. default), pesan-pesan ini kemungkinan besar juga akan muncul di filekern.log
log.sehingga Anda dapat melakukan sesuatu seperti:
sumber
/var/log/kern.log
cukup spesifik untuk Linux. Untuk OpenBSD (dan mungkin yang lain), item dmesg akan masuk / var / log / messages. Memang, beberapa hal lain juga ada di sana.tail -f /var/log/{messages,kernel,dmesg,syslog}
via superuser: is-it-possible-to-tail-f-the-output-of-dmesgAnda menggunakan
dmesg
untuk mendapatkan pesan log dari kernel.Kernel itu sendiri login ke buffer cincin, yaitu hanya di memori. Sekarang semua yang
dmesg
dilakukan adalah mengeluarkan konten buffer cincin itu. Jika Anda melakukannyadmesg -c
juga akan menghapus buffer cincin setelahnya.Oleh karena itu Anda dapat melakukan sesuatu seperti
while true; do dmesg -c; sleep 1; done
memiliki sesuatu yang setara dengan yang tidak berfungsidmesg|tail
. Tapi ini menghapus buffer cincin dan karenanya membutuhkan kekuatan root.Cara lainnya adalah file
/proc/kmsg
yang memungkinkan tampilan pada buffer cincin. Anda bisa melakukannyatail -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/log
apakah ada file yang sesuai dengan kebutuhan Anda dan konfigurasikan daemon logging Anda sebaliknya.sumber
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:
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,
sumber
Pada sistem yang menggunakan
systemd
Anda juga dapat:sumber
Gunakan 2 perintah ini dari terminal terpisah:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Ini akan mencapai hasil yang serupa.
sumber