Jak mogę zobaczyć wyjście dmesg, gdy się zmienia?

141

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ć?

Milad Khajavi
źródło
1
superuser.com/questions/289239/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

178

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.

maxschlepzig
źródło
2
Niezłe znalezisko! Gentoo nie grok, -Hale poza tym spot-on
unperson325680,
Narzędzia przestrzeni użytkownika muszą mieć wersję 2.22+. Użytkownicy Ubuntu muszą czekać na wersję 14.10 „utopic”
Daniel Alder
1
Ubuntu nie grok -w - trzeba użyć zegarka (poniżej)
Brent Faust
2
Wow, odpowiedź sysadmin, która używa - flag o nazwie opisowej zamiast kryptycznych flag jednoznakowych. BRAVO, SIR. BRAWO.
allyourcode
1
-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.)
mwfearnley
54

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.

Peter
źródło
2
Jeśli użyjesz pojedynczych cudzysłowów zamiast podwójnych cudzysłowów (lub unikniesz znaku dolara), otrzymasz nową wartość $ LINES dla każdego wywołania, więc dostosuje się, jeśli zmienisz rozmiar terminalu.
P Daddy
Pojedyncze cudzysłowy powstrzymają zmienną ekspansję. Co więcej, zmienna jest rozwinięta tylko raz w tym przykładzie - po wywołaniu 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.
peterph
2
To o to chodzi. Pojedyncze cudzysłowy zabraniają rozszerzenia zmiennej, gdy powłoka przekazuje argumenty 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.
P Daddy,
Hmm, masz rację - zakładam 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.
Peter
12

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
umläute
źródło
/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ą.
kurtm
2
tail -f /var/log/{messages,kernel,dmesg,syslog}za pośrednictwem superużytkownika: czy to możliwe do ogona-wyjścia-z-dmesg
tutaj
9

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.

michas
źródło
//, W systemie CEntOS 6, którego używam, dostosowywanie i przeglądanie / proc / kmsg nie generuje danych wyjściowych. [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
Nathan Basanese
8

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ę,

użytkownik241342
źródło
1
Naprawdę przydatne do debugowania Androida.
val
5

W systemach, które z nich korzystają systemd, możesz również:

# journalctl -kf
Maksyma
źródło
1
Ubuntu 14.10: ➜ ~ journalctl -kf Nie znaleziono plików dziennika.
Nathan Basanese
0

Użyj tych 2 poleceń z oddzielnych terminali:

  1. while true; do dmesg -c >> test.txt;sleep 1; done
  2. tail -f test.txt

Osiągnie podobny wynik.

K_K
źródło
//, To po prostu instruuje dmesg, aby dołączyć dane wyjściowe do test.txt, prawda? A drugie polecenie tylko ogląda ten plik test.txt?
Nathan Basanese,
Dzięki .. tak .. 2. polecenie obserwuje zmiany w dmesg. cat / proc / kmsg może osiągnąć podobny wynik, ale nie zapisuje dzienników w pliku.
K_K