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?
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?
Jawaban:
dmesg
Versi yang relatif baru memberikan opsi ikuti ( -w
, --follow
) yang berfungsi secara analog tail -f
.
Jadi, cukup gunakan perintah berikut:
$ dmesg -wH
( -H
, --human
memungkinkan fitur yang mudah digunakan seperti warna, waktu relatif)
Opsi-opsi itu tersedia misalnya di Fedora 19.
-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 ini
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
yang $((LINES-6))
bagian harus membuatnya cocok baik ke terminal Anda.
watch
. Dengan demikian itu tidak akan benar-benar berubah antara doa dmesg
. 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
menggunakan popen()
, 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 Anda syslog
memiliki beberapa pengaturan waras (mis. default), pesan-pesan ini kemungkinan besar juga akan muncul di file kern.log
log.
sehingga Anda dapat melakukan sesuatu seperti:
tail -f /var/log/kern.log
/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-dmesg
Anda 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 melakukannya dmesg -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 berfungsi dmesg|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 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/log
apakah ada file yang sesuai dengan kebutuhan Anda dan konfigurasikan daemon logging Anda sebaliknya.
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,
Pada sistem yang menggunakan systemd
Anda juga dapat:
# journalctl -kf
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.