Piszę sterownik urządzenia, który drukuje komunikat o błędzie na wyjściu bufora pierścieniowego dmesg. Chcę zobaczyć, dmesgjak zmienia się wynik.
Jak mogę to zrobić?
Piszę sterownik urządzenia, który drukuje komunikat o błędzie na wyjściu bufora pierścieniowego dmesg. Chcę zobaczyć, dmesgjak zmienia się wynik.
Jak mogę to zrobić?
Odpowiedzi:
Stosunkowo najnowsze dmesgwersje oferują opcję śledzenia ( -w, --follow), która działa analogicznie do tail -f.
Dlatego po prostu użyj następującego polecenia:
$ dmesg -wH
( -H, --humanumożliwia przyjazne dla użytkownika funkcje, takie jak kolory, czas względny)
Te opcje są dostępne na przykład w Fedorze 19.
-Hale poza tym spot-on
-wpowinien działać w każdej wersji Ubuntu od Utopic (14.10). ( Launchpad.net/ubuntu/+source/util-linux/+publishinghistory sugeruje wczesne pakiety Utopic były na 2,20, ale osiągnął 2.25 do czasu, gdy został zwolniony.)
Możesz użyć watchpolecenia przeznaczonego dokładnie do takich rzeczy
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
$((LINES-6))część powinna pasować ładnie do terminalu.
watch. Dlatego tak naprawdę nie zmieni się między wywołaniami dmesg. Trzeba byłoby użyć opakowania, które zapytałoby o stan terminala.
watch, dlatego watch wykona polecenie z wyrażeniem zmiennym, które zostanie rozwinięte przez wywoływaną przez niego powłokę. Za każdym razem. Spróbuj, to działa.
watchużycie popen(), co oznacza, że kolejna powłoka jest spawnowana, a zmienna środowiskowa jest przez nią dostarczana (i w ten sposób aktualizowana przy każdym uruchomieniu). Niezłe znalezisko.
tak naprawdę nie można monitorować wyników dmesgbezpośrednio.
istnieje jednak duże prawdopodobieństwo, że moduł nie drukuje bezpośrednio w buforze pierścieniowym dmesg, ale zamiast tego korzysta z funkcji rejestrowania jądra (które następnie zostaną wyświetlone przez dmesg). jeśli masz syslogpewne rozsądne (np. domyślne) ustawienia, te wiadomości najprawdopodobniej pojawią się również w kern.logpliku dziennika.
dzięki czemu możesz zrobić coś takiego:
tail -f /var/log/kern.log
/var/log/kern.logjest dość specyficzny dla Linuksa. W przypadku OpenBSD (i ewentualnie innych), dmesg loguje się w / var / log / messages. Oczywiście niektóre inne rzeczy też tam są.
tail -f /var/log/{messages,kernel,dmesg,syslog}za pośrednictwem superużytkownika: czy to możliwe do ogona-wyjścia-z-dmesg
Służy dmesgdo pobierania komunikatów dziennika jądra.
Samo jądro loguje się do bufora pierścieniowego, tj. Tylko w pamięci. Teraz wszystko dmesgwypisuje zawartość tego bufora pierścieniowego. Jeśli to zrobisz dmesg -c, usuniesz również bufor bufora.
Dlatego możesz zrobić coś takiego, jak while true; do dmesg -c; sleep 1; donecoś niedziałającego dmesg|tail. Ale to usuwa bufor pierścieniowy i dlatego wymaga uprawnień roota.
Innym sposobem jest plik, /proc/kmsgktóry umożliwia przeglądanie bufora pierścieniowego. Możesz to zrobić tail -f /proc/kmsg, ale jest to dozwolone tylko dla jednego procesu i jest to zwykle demon logowania. - Jego zadaniem jest odczytywanie wiadomości i zapisywanie ich w prawdziwych plikach (zwykle w / var / log), gdzie można je odczytać. Można go skonfigurować tak, aby wysyłał wszystkie wiadomości do jednego pliku lub różnych części do różnych plików. (Ale konfiguracja zależy od demona rejestrowania w systemie).
Dlatego sprawdź, /var/logczy jest jakiś plik, który odpowiada Twoim potrzebom, i w przeciwnym razie skonfiguruj demona logowania.
Jeśli używasz systemu osadzonego, busybox, który jest powszechny w systemach takich jak OpenWRT, ma bardzo ograniczoną funkcjonalność i obsługiwane są tylko 2-3 flagi.
Jeśli chcesz szybkiego i brudnego sposobu ciągłego drukowania wyników dmesg na ekranie wraz ze zmianami zdarzeń, prosta pętla bash działa dobrze. Nie jest to idealne, ale jak wspomniałem, dmesg BusyBox brakuje wielu funkcji. Uważam, że następujące polecenie ma taki sam efekt po wprowadzeniu do wiersza poleceń:
$ while true; do dmesg -c ; sleep 1 ; done
możesz wyjść z pętli za pomocą Ctrl-C, sen 1 polega na tym, że niepotrzebnie obciąża procesor, a flaga -c czyści bufor przy każdym wywołaniu, więc nie widzisz powtarzającego się wyjścia co sekundę,
W systemach, które z nich korzystają systemd, możesz również:
# journalctl -kf
Użyj tych 2 poleceń z oddzielnych terminali:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtOsiągnie podobny wynik.