Czy możliwe jest `tail -f` wyjście` dmesg`?


137

Chcesz zrobić coś takiego

dmesg | tail -f

ale to nie działa: używam Mac OSX 10.6.7, robiąc to, że ogon się kończy, zamiast monitorować wyjście.

Zastanawiam się, czy jest jakiś sposób, aby to zrobić, czy jakieś równoważne polecenie. PS, nie sądzę, że whilepętla będzie dobrym pomysłem.


który działa dobrze na moim systemie Ubuntu 10.04LTS. Obejściem tego problemu byłoby dopasowanie dowolnego pliku dziennika, w którym syslog umieszcza komunikaty jądra.

4
W systemie Mac OSX ten plik to /var/log/kernel.log

1
@Anonymous 2: Niestety, kernel.lognie zawiera takich samych danych wyjściowych jak dmesg. Na przykład w przypadku uszkodzonego dysku błędy odczytu pliku dmesgokreślają dokładnie, którego pliku nie można odczytać, a kernel.logniestety podaje tylko mniej niż pomocne powiadomienie:disk0s2: I/O error.
Ivan Vučica,

3
Od Linuksa 3.5 możesz zrobić dmesg -w.
Doug Richardson,

Odpowiedzi:


119

Prawdopodobnie szukasz kombinacji wiadomości z różnych plików dziennika. Próbować:

tail -f /var/log/{messages,kernel,dmesg,syslog}

… Aby uzyskać całkiem niezły przegląd systemu. Jeśli chcesz więcej lub mniej, sprawdź, w jakim pliku dziennika umieszczane są wiadomości, które chcesz zobaczyć.

Zobacz także, jak używać multitailpliku i kodu koloru oraz filtrować wiele plików dziennika jednocześnie.

Edycja: To nie było zbyt istotne, kiedy odpowiedziałem na to, ale ponieważ ta strona jest bardzo popularna, warto wspomnieć, że nowsze systemy z systemem mają to.

dmesg -w

4
Dzięki za heads-up re: multitail. Wygląda ciekawie. W przypadku OS X to będzie coś takiego: tail -f /var/log/{system.log,kernel.log}.
boehj

2
system.logi kernel.lognie zawierają dokładnych danych wyjściowych systemu dmesgOS X. Na przykład w przypadku uszkodzonego dysku błędy odczytu pliku dmesgokreślają dokładnie, którego pliku nie można odczytać, a kernel.logniestety podaje tylko mało pomocne powiadomienie:disk0s2: I/O error.
Ivan Vučica

3
Dla przypomnienia, ta odpowiedź nie działa w systemie OS X Mavericks (10.9) ani Arch Linux.
Elle Mundy

@ Dan Na Archie prawdopodobnie nie masz zainstalowanego demona syslog ani włączonej usługi. Zauważyłem, że nie jest to część pakietu podstawowego, mimo że jest to dość fundamentalne. OSX jest oparty na BSD i ma różne ścieżki dla wielu rzeczy. Musisz dowiedzieć się, jak i gdzie Twój system obsługuje rejestrowanie i dostosowanie. Moja odpowiedź jest dość ogólna i obejmuje większość dystrybucji opartych na FHS z włączonym syslog, ale jest też wiele różnych wariantów implementacji.
Caleb

1
++ w edycji.
pstanton

56

Po prostu spraw, aby @ # $% ing działało

  1. Chcesz wydrukować wyjście dmesg, stale, natychmiast
  2. Dmesg drukuje bufor pierścieniowy jądra (patrz man dmesg)
  3. Bufor pierścieniowy jądra jest specjalnym plikiem proc, /proc/kmsg(patrz man proc)
  4. Czytaj /proc/kmsgbezpośrednio, tj cat /proc/kmsg.

Teraz, jeśli przeczytasz przyjazną instrukcję proc, surowo ostrzeże Cię, aby pozwolić tylko jednemu użytkownikowi (który musi być uprzywilejowanym) czytać /proc/kmsgna raz. Jakakolwiek implementacja syslog powinna być wykonywana i przypuszczalnie to działa dmesg. Nie wiem, jestem poza moją ligą, parafrazuję instrukcję. Tak więc, chociaż jest to sposób „po prostu zrób to @ # $% ing”, rozważ najpierw kilka następnych metod.

Zatwierdzona strona podręcznika: zegarek + dmesg

Na Arch gnu / linux z systemd init *, dmesg.log nie jest zapisywany zbyt często, może wcale? Najlepszym sposobem na ciągłe odczytywanie bufora dziennika jądra jest watch. Powinieneś zacząć od czegoś takiego (dostosuj, ile linii zmieści się w twoim terminalu):

watch 'dmesg | tail -50'

watch + dmesg + daemon + tail -f

Bardziej skomplikowanym rozwiązaniem może być użycie watch do zapisania danych wyjściowych dmesg do pliku, co można wtedy zrobić tail -f. Prawdopodobnie chciałbyś, aby działało to jako demon. Właściwy demon również gzipowałby i obracał logi. Poniższy kod bash jest nieprzetestowany, nie działa i ma jedynie na celu przekazanie pomysłu. Odpowiedź Brooksa Mojżesza ma działającą wersję .

watch 'dmesg >> /var/log/dmesg.log | tail -1'

* tangens, ponieważ jest to pytanie osx, ale kiedy systemd jest w pobliżu, nie przejmuj się dmesg, użyj journalctl -xf(może w / -n 100aby również wyświetlić poprzednie 100 wierszy)


1
OS X nie ma /proc, ale reszta odpowiedzi ma zastosowanie. watchmożna zainstalować z MacPorts: macports.org
Ivan Vučica,

@Ivan Vučica Ah, dobrze wiedzieć. Zastanawiam się, gdzie OSX reprezentuje bufor pierścieniowy jądra.
djeikyb

2
Wygląda na to, że znajduje się bezpośrednio w pamięci jądra. Kod źródłowy Apple dmesgrealizacji: opensource.apple.com/source/system_cmds/system_cmds-230.7/... Szybkie Googling nie wspomina nic o to reprezentowane w systemie plików: /
Ivan Vučica

42

Dla zainteresowanych Linuksem, ponieważ jądro jądra 3.5.0:

# dmesg -w

Również w systemach z systemd:

# journalctl -kf

6
dmesg -wjest absolutnie najładniejszym rozwiązaniem. Niestety, nawet Ubuntu 14.04 nie wydaje się na to gotowy, ponieważ narzędzie przestrzeni użytkownika jeszcze go nie obsługuje.
Daniel Alder,

1
Ta odpowiedź zdecydowanie zasługuje teraz na więcej głosów poparcia.
m4tx

2
tak, to miły mały samorodek. może być czytelny dla człowieka za pomocą: dmesg -wH
faustus

21

Oto wariant odpowiedzi djeikyba, który został przetestowany i naprawiono kilka błędów.

watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'

Ważną sztuczką jest to, że robimy to dmesg -c, co czyści bufor pierścieniowy po wydrukowaniu - dlatego za każdym razem drukujemy tylko to, co nowe od ostatniego razu. Aby to zrobić, musisz być rootem sudo. Jest też poprawka; zamiast próbować zarówno zrzucić dane wyjściowe do pliku, jak i przesunąć go do końca (co nie działa), po prostu czytamy z nowo napisanego pliku.

dmesg > /tmp/dmesg.logPrzy każdej iteracji moglibyśmy po prostu nadpisać i nadpisać cały plik, ale jest to dużo operacji we / wy, a także ryzyko utraty pliku, jeśli komputer ulegnie awarii w trakcie nadpisywania.

Można też zrobić coś podobnego, który jest bliżej jak tail -fz pętli while, który wykonuje dmesg -ci sleep 1na zawsze (patrz odpowiedź Bena Harrisa). Ponieważ jednak tak naprawdę wyczyszcza bufor komunikatów jądra podczas jego działania, możesz również chcieć przesłać rzeczy do pliku dziennika na wypadek, gdybyś chciał je później.


6

To może Ci pomóc

while true;do sudo dmesg -c;done

Należy pamiętać, że flaga -c usuwa bufor komunikatów do standardowego wyjścia. „Sudo” jest niepotrzebne, jeśli jesteś rootem. Jeśli uważasz, że to pochłania zbyt dużo zasobów procesora, spróbuj dodać „uśpienie 1” przed wykonaniem pętli.


oglądanie może tam być dobre, jeśli cały czas oglądasz ekran
Seth Robertson

2
Możesz cytować swoje źródła: linuxforums.org/forum/applications/…

2
Szybko i brudno. Brudny, ponieważ działa tylko wtedy, gdy jesteś jedynym użytkownikiem, który to robi. W przeciwnym razie każdy użytkownik otrzymuje tylko połowę wiadomości
Daniel Alder

rozwiązuje mój problem z Androidem ADB.
PAntoine,

5

Czy to przed obejrzeniem tego postu:

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }        
    sleep 1;
}
exit;

3

możesz być w stanie:

tail -f /var/log/messages

2
W większości systemów plik dziennika dmesg jest po prostu statycznym zrzutem bufora dmesg po zakończeniu rozruchu systemu. Następnie wszelkie nowe wiadomości jądra zwykle przechodzą do innego pliku dziennika, a plik dmesg pozostanie niezmieniony aż do ponownego uruchomienia.

7
Nie wiem o „większości” systemów, ale żaden z administrowanych przeze mnie systemów GNU Linux nie zachowuje się w ten sposób. dmesgzgłasza bieżący zestaw najnowszych komunikatów z jądra, zwykle specyficznych dla podsystemów sprzętowych.
Caleb

3

podczas gdy dmesg -c >> /tmp/dmesg.log; śpij 0,1; gotowe i tail -f /tmp/dmesg.log


Proszę wyjaśnić, dlaczego jest to rozwiązanie.
ChrisF,

To właśnie robią niektóre dystrybucje za kulisami. Odpytuje bufor pierścieniowy jądra i loguje go do /tmp/dmesg.log co 0,1 sekundy w zadaniu w tle, podczas gdy ogłasza to wyjście. Jest to także jedyna metoda, która zadziała, jeśli nie masz czegoś specjalnego działającego w tle - lub jeśli zabiłeś wszystkie procesy i usługi w tle i wykonujesz awaryjne rozwiązywanie problemów.
Dagelf

1
Wydaje się prostszy w użyciuwatch
poolie

Jeśli masz go dostępnego :-) czasami jesteś w środowisku, w którym nawet nie masz ogona ... możesz użyć cat /tmp/dmesg.log lub dd nawet ... Jeśli nie możesz pisać do / tmp i nie można zamontować -t tmpfs - / tmp lub ramfs, ani pisać do / dev / shm / ... wtedy możesz po prostu dmesg -c; spać 0,1; do echo> / dev / null; skończone, jeśli nie śpisz, tylko dmesg -c; do echo> / dev / null; gotowy; Czasami nawet nie masz ls ... to po prostu echo * :-D
Dagelf

2

Używam tego aliasu w /root/.bashrc;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

który podąża za dmesg i dostosowuje linie dla dowolnego terminala, do którego się wzywa.


0

Zgodnie z bieżącym Ubuntu (używam Ubuntu 12.04),

tail -f /var/log/syslog

może spełnić wymagania.


0

Użyłem tego kodu, aby wyszukać specjalne zdarzenie jądra i przesłałem mu proces „callback”:

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 

-2

odpowiedź na stare pytanie, ale może się przydać :)

dmesg | tail -f -

przesyła wyjście dmesg przez ogon, używając operatora - jako skrótu do standardowego wyjścia


2
To jest kod z pytania, które nie działa.
pabouk

2
Nie działa, ponieważ dmesgzamyka wyjście po zamknięciu raz. tail -fnie mogę tego już zmienić.
Daniel Alder,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.