Piszę sterownik urządzenia, który drukuje komunikat o błędzie na wyjściu bufora pierścieniowego dmesg. Chcę zobaczyć, dmesg
jak 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ć, dmesg
jak zmienia się wynik.
Jak mogę to zrobić?
Odpowiedzi:
Stosunkowo najnowsze dmesg
wersje 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
, --human
umożliwia przyjazne dla użytkownika funkcje, takie jak kolory, czas względny)
Te opcje są dostępne na przykład w Fedorze 19.
-H
ale poza tym spot-on
-w
powinien 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ć watch
polecenia 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.
watch
uż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 dmesg
bezpoś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 syslog
pewne rozsądne (np. domyślne) ustawienia, te wiadomości najprawdopodobniej pojawią się również w kern.log
pliku dziennika.
dzięki czemu możesz zrobić coś takiego:
tail -f /var/log/kern.log
/var/log/kern.log
jest 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 dmesg
do pobierania komunikatów dziennika jądra.
Samo jądro loguje się do bufora pierścieniowego, tj. Tylko w pamięci. Teraz wszystko dmesg
wypisuje 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; done
coś niedziałającego dmesg|tail
. Ale to usuwa bufor pierścieniowy i dlatego wymaga uprawnień roota.
Innym sposobem jest plik, /proc/kmsg
któ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/log
czy 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; done
tail -f test.txt
Osiągnie podobny wynik.