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ć?
linux
command-line
logs
dmesg
Milad Khajavi
źródło
źródło
Odpowiedzi:
Stosunkowo najnowsze
dmesg
wersje oferują opcję śledzenia (-w
,--follow
), która działa analogicznie dotail -f
.Dlatego po prostu użyj następującego polecenia:
(
-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.
źródło
-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$((LINES-6))
część powinna pasować ładnie do terminalu.źródło
watch
. Dlatego tak naprawdę nie zmieni się między wywołaniamidmesg
. 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życiepopen()
, 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 maszsyslog
pewne rozsądne (np. domyślne) ustawienia, te wiadomości najprawdopodobniej pojawią się również wkern.log
pliku dziennika.dzięki czemu możesz zrobić coś takiego:
źródło
/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-dmesgSł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 zrobiszdmesg -c
, usuniesz również bufor bufora.Dlatego możesz zrobić coś takiego, jak
while true; do dmesg -c; sleep 1; done
coś niedziałającegodmesg|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.źródło
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ń:
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ę,
źródło
W systemach, które z nich korzystają
systemd
, możesz również:źródło
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.
źródło