Ring buffer dmesg çıkışına hata mesajı basan bir aygıt sürücüsü yazıyorum . dmesgDeğ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 . dmesgDeğişen çıktılarını görmek istiyorum .
Bunu nasıl yapabilirim?
Yanıtlar:
Nispeten yeni dmesgsü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, --humanrenkler, göreceli zaman gibi kullanıcı dostu özellikler sağlar)
Bu seçenekler örneğin Fedora 19'da mevcuttur.
-Hama başka bir şey görür
-wUtopic'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 watchgibi ş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.
watchkullanı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.
dmesgdoğ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 syslogaklı başında (örneğin varsayılan) ayarlarınız varsa, bu mesajlar büyük olasılıkla kern.loglogfile de görünecektir .
Böylece şöyle bir şey yapabilirsiniz:
tail -f /var/log/kern.log
/var/log/kern.logoldukç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 -cdaha 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/kmsghalka 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/logihtiyaç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,
systemdSizi kullanan sistemlerde ayrıca:
# journalctl -kf
Bu 2 komutu ayrı terminallerden kullanın:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtBenzer bir sonuç elde edecek.