Ring buffer dmesg çıkışına hata mesajı basan bir aygıt sürücüsü yazıyorum . dmesg
Değişen çıktılarını görmek istiyorum .
Bunu nasıl yapabilirim?
Ring buffer dmesg çıkışına hata mesajı basan bir aygıt sürücüsü yazıyorum . dmesg
Değişen çıktılarını görmek istiyorum .
Bunu nasıl yapabilirim?
Yanıtlar:
Nispeten yeni dmesg
sürümler , benzer şekilde çalışan bir takip seçeneği ( -w
, --follow
) sağlar tail -f
.
Böylece, sadece aşağıdaki komutu kullanın:
$ dmesg -wH
( -H
, --human
renkler, göreceli zaman gibi kullanıcı dostu özellikler sağlar)
Bu seçenekler örneğin Fedora 19'da mevcuttur.
-H
ama başka bir şey görür
-w
Utopic'ten Ubuntu'nun her versiyonunda çalışmalı (14.10). ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory , ilk Ütopik paketlerin 2.20 olduğunu, ancak piyasaya sürüldüğü sırada
Bu watch
gibi şeyler için tasarlanan komutu kullanabilirsiniz.
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
$((LINES-6))
bölümü, bu terminale bir şekilde sığacak yapmalıdır.
watch
; Bu nedenle, gerçekten de onların aşıları arasında bir değişiklik olmayacak dmesg
. Biri terminal durumunu sorgulayacak bir sarıcı kullanması gerekir.
watch
, bu nedenle watch komutu, içinde bulunduğu kabuk tarafından genişletilecek olan değişken ifadesiyle yürütür. Her zaman. Deneyin, işe yarıyor.
watch
kullanımları popen()
başka bir kabuk kökenli anlamına gelir ve çevre değişkeni sonra onun tarafından sağlanan (ve her koşmak yürütmek üzerine böylece güncellenir) olduğunu. Güzel buldum.
dmesg
doğrudan çıktısını gerçekten izleyemezsiniz .
bununla birlikte, modülünüzün doğrudan dmesg'in halka arabelleğine yazdırmama olasılığı yüksektir, ancak bunun yerine çekirdek günlüğü olanaklarını kullanır (bu durumda görüntülenecektir dmesg
). eğer syslog
aklı başında (örneğin varsayılan) ayarlarınız varsa, bu mesajlar büyük olasılıkla kern.log
logfile de görünecektir .
Böylece şöyle bir şey yapabilirsiniz:
tail -f /var/log/kern.log
/var/log/kern.log
oldukça Linux özgüdür. OpenBSD için (ve muhtemelen başkaları için) dmesg olayı / var / log / messages'de oturum açar. Verilen, başka şeyler de oraya gider.
dmesg
Çekirdeğin günlük mesajlarını almak için kullanın .
Çekirdeğin kendisi bir halka arabelleğine, yani yalnızca bellekte oturum açar. Şimdi her dmesg
şey o ring arabelleğinin içeriğini çıkartıyor. Bunu yaparsanız dmesg -c
daha sonra halka tamponunu da siler.
Bu nedenle while true; do dmesg -c; sleep 1; done
çalışmamaya eşdeğer bir şeye sahip olmak gibi bir şey yapabilirsiniz dmesg|tail
. Ancak bu, halka tamponunu siler ve bu nedenle kök güçlere ihtiyaç duyar.
Diğer yol, /proc/kmsg
halka arabelleğinde görünüme izin veren dosyadır . Yapabilirsin tail -f /proc/kmsg
, ama bu sadece bir işleme izin veriyor, ve bu genellikle senin günlük planlaman. - İşi mesajları okumak ve okunabilecekleri gerçek dosyalara (genellikle / var / log içinde) yazmaktır. Tüm mesajları tek bir dosyaya veya farklı parçalara farklı dosyalara vermek için yapılandırılabilir. (Ancak yapılandırma, sisteminizin günlük arka planına bağlıdır.)
Bu nedenle /var/log
ihtiyaçlarınızı karşılayan bir dosya olup olmadığına bir göz atın ve günlükleme arka plan planınızı yapılandırın.
Gömülü bir sistem kullanıyorsanız, OpenWRT gibi sistemlerde yaygın olan meşgul kutusu çok sınırlı işlevselliğe sahiptir ve yalnızca 2-3 bayrak desteklenir.
Olaylar değiştikçe sürekli ekranda dmesg çıktısını hızlı ve kirli bir şekilde yazdırmak istiyorsanız, basit bir bash döngüsü iyi sonuç verir. İdeal değil ama BusyBox'tan bahsettiğim gibi dmesg'de pek çok işlev eksik. Aşağıdakilerin komut satırına girildiğinde aynı etkiye sahip olduğunu görüyorum:
$ while true; do dmesg -c ; sleep 1 ; done
Ctrl-C ile döngüden çıkabilirsiniz uyku 1, CPU'yu gereksiz yere vurmayı durdurmaktır ve -c bayrağı her çağrıdaki arabellekleri temizler, böylece her saniyede tekrarlanan çıktı görmezsiniz,
systemd
Sizi kullanan sistemlerde ayrıca:
# journalctl -kf
Bu 2 komutu ayrı terminallerden kullanın:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Benzer bir sonuç elde edecek.