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?
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?
Jawaban:
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.
-Htetapi sebaliknya
-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.)
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.
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.
watchmenggunakan 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 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
/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.
tail -f /var/log/{messages,kernel,dmesg,syslog}via superuser: is-it-possible-to-tail-f-the-output-of-dmesg
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.
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 systemdAnda juga dapat:
# journalctl -kf
Gunakan 2 perintah ini dari terminal terpisah:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtIni akan mencapai hasil yang serupa.