È possibile `tail -f` l'output di` dmesg`?


137

Vuoi fare qualcosa del genere

dmesg | tail -f

ma non funziona: uso Mac OSX 10.6.7, facendo uscire la coda, invece di monitorare l'output.

Mi chiedo se c'è un modo per farlo o un comando equivalente. PS, non penso che un whileloop sia una buona idea.


che funziona benissimo sulla mia scatola Ubuntu 10.04LTS. Una soluzione alternativa sarebbe quella di adattare qualunque file di log in cui syslog sta inserendo i messaggi del kernel.

4
Su Mac OSX, quel file è /var/log/kernel.log

1
@Anonimo 2: Sfortunatamente, kernel.lognon contiene lo stesso output di dmesg. Ad esempio, per un'unità danneggiata, gli errori di lettura del file dmesgspecificano esattamente quale file non può essere letto, kernel.logpurtroppo fornisce solo un avviso meno utile:disk0s2: I/O error.
Ivan Vučica,

3
Da Linux 3.5, puoi fare dmesg -w.
Doug Richardson,

Risposte:


120

Probabilmente stai cercando una combinazione di messaggi da vari file di registro. Provare:

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

... per avere una visione abbastanza buona del sistema. Se vuoi più o meno di quello, cerca in quale file di registro vengono inseriti i messaggi che vuoi vedere.

Cerca anche di utilizzare il multitailfile e il codice colore e di filtrare più file di registro contemporaneamente.

Modifica: questo non è stato molto rilevante quando ho risposto a questa domanda, ma poiché questa pagina ottiene molti successi, ho pensato che valesse la pena ricordare che i sistemi più recenti che eseguono systemd hanno questo.

dmesg -w

5
Grazie per l'heads-up re: multitail. Sembra interessante. Nel caso di OS X sarà qualcosa del tipo: tail -f /var/log/{system.log,kernel.log}.
Boehj,

2
system.loge kernel.lognon contengono l'output esatto di dmesgsu OS X. Ad esempio, per un'unità danneggiata, gli errori di lettura del file dmesgspecificano esattamente quale file non può essere letto, mentre kernel.logpurtroppo fornisce solo un avviso meno utile:disk0s2: I/O error.
Ivan Vučica,

3
Per la cronaca, questa risposta non funziona su OS X Mavericks (10.9) o Arch Linux.
Elle Mundy,

@Dan Su Arch probabilmente non hai un demone syslog installato o il suo servizio abilitato. Ho notato che non fa parte del set di pacchetti di base anche se è piuttosto fondamentale. OSX è basato su BSD e ha percorsi diversi per molte cose. Dovrai capire come e dove il tuo sistema gestisce la registrazione e la regolazione. La mia risposta è piuttosto generica e copre la maggior parte delle distro basate su FHS con syslog abilitato, ma ci sono anche molte implementazioni di varianti.
Caleb,

1
++ sulla modifica.
Pstanton,

56

Fallo funzionare @ # $% ing

  1. Volete stampare l'output di dmesg, costantemente, immediatamente
  2. Dmesg sta stampando il buffer dell'anello del kernel (vedi man dmesg)
  3. Il buffer dell'anello del kernel è un file proc speciale, /proc/kmsg(vedi man proc)
  4. Leggi /proc/kmsgdirettamente, ad es cat /proc/kmsg.

Ora, se leggi il simpatico manuale proc, ti avvertirà severamente di far leggere /proc/kmsgun solo utente (che deve essere privilegiato) alla volta. Qualunque sia l'implementazione di syslog che dovresti fare, e presumibilmente funziona dmesg. Non so, sono fuori dalla mia portata qui, sto solo parafrasando il manuale. Quindi, mentre questo è il modo "basta farlo @ # $% ing lavoro", considera prima i metodi della coppia successiva.

Pagina man approvata: watch + dmesg

Su Arch gnu / linux con systemd init *, dmesg.log non viene scritto molto spesso, forse per niente? Il modo migliore che ho trovato per leggere continuamente il buffer di registro del kernel è con watch. Qualcosa del genere dovrebbe iniziare (regolare per quante linee si adattano al tuo terminale):

watch 'dmesg | tail -50'

guarda + dmesg + daemon + tail -f

Una soluzione più complessa potrebbe utilizzare watch per scrivere l'output di dmesg su file, che è quindi possibile tail -f. Probabilmente vorresti che funzionasse come un demone. Un demone corretto inoltre gzip e ruoterebbe i log. Il seguente codice bash non è testato, non funziona e ha solo lo scopo di trasmettere un'idea. @Brooks La risposta di Mosè ha una versione funzionante .

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

* tangente, perché questa è una domanda osx, ma quando systemd è in giro, non preoccuparti dmesg, usa journalctl -xf(forse w / -n 100per mostrare anche le 100 linee precedenti)


1
OS X non ha /proc, tuttavia è applicabile il resto della risposta. watchpuò essere installato da MacPorts
Ivan Vučica,

@Ivan Vučica Ah, buono a sapersi. Mi chiedo dove OSX rappresenti il ​​buffer dell'anello del kernel ..
djeikyb,

2
Sembra che sia direttamente nella memoria del kernel. Codice sorgente per l' dmesgimplementazione di Apple : opensource.apple.com/source/system_cmds/system_cmds-230.7/… Quick Googling non menziona nulla sul fatto che sia rappresentato nel filesystem: /
Ivan Vučica,

42

Per coloro che sono interessati a Linux, dal kernel kernel 3.5.0:

# dmesg -w

Anche sui sistemi con systemdte puoi:

# journalctl -kf

6
dmesg -wè la soluzione assolutamente migliore. Sfortunatamente, anche Ubuntu 14.04 non sembra essere pronto per questo perché lo strumento spazio utente non lo supporta ancora.
Daniel Alder,

1
Questa risposta merita sicuramente più voti adesso.
m4tx,

2
sì, questa è una bella pepita. può essere reso leggibile dall'uomo con: dmesg -wH
faustus,

21

Ecco una variante della risposta di djeikyb che è stata effettivamente testata e risolve un paio di bug.

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

Il trucco importante è che lo stiamo facendo dmesg -c, che cancella il buffer dell'anello dopo la stampa, quindi ogni volta stampiamo solo le novità dall'ultima volta. Dovrai essere root per farlo, quindi il sudo. C'è anche un bugfix; invece di provare a scaricare l'output su un file e a reindirizzarlo (che non funziona), stiamo solo leggendo dal file appena scritto.

Potremmo fare solo dmesg > /tmp/dmesg.loge sovrascrivere l'intero file ogni iterazione, ma questo è un sacco di I / O e rischia anche di perdere il file se il computer si arresta in modo anomalo nel mezzo di una sovrascrittura.

Potresti anche fare qualcosa di simile che è più simile tail -fa un ciclo while che viene eseguito dmesg -cper sleep 1sempre (vedi la risposta di Ben Harris). Tuttavia, poiché questo sta effettivamente cancellando il buffer dei messaggi del kernel mentre è in esecuzione, potresti anche voler convogliare le cose in un file di registro nel caso in cui le desideri in un secondo momento.


6

Questo potrebbe funzionare per te

while true;do sudo dmesg -c;done

Tieni presente che il flag '-c' cancella il buffer dei messaggi in stdout. Il "sudo" non è necessario se si è root. Se ritieni che questo stia consumando troppo della tua risorsa CPU, prova ad aggiungere un "sleep 1" prima che il ciclo sia terminato.


guardare potrebbe essere buono lì, se stai guardando lo schermo per tutto il tempo
Seth Robertson,

2
Sentiti libero di citare le tue fonti: linuxforums.org/forum/applications/…

2
Veloce e sporco. Sporco perché funziona solo se sei l'unico utente a farlo. Altrimenti ogni utente riceve solo la metà dei messaggi
Daniel Alder,

risolve il mio problema Android adb.
PAntoine,

5

Ho fatto questo prima di vedere questo post:

#!/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

potresti essere in grado di fare:

tail -f /var/log/messages

2
Sulla maggior parte dei sistemi, il file di registro dmesg è solo un dump statico del buffer dmesg al termine dell'avvio del sistema. Successivamente, i nuovi messaggi del kernel di solito vanno in un altro file di registro e il file dmesg rimarrà invariato fino al riavvio.

7
Non conosco i sistemi "più", ma nessuno dei sistemi GNU Linux che gestisco in questo modo. dmesgriporta una serie corrente degli ultimi messaggi dal kernel, di solito specifici per i sottosistemi hardware.
Caleb,

3

mentre dmesg -c >> /tmp/dmesg.log; dormire 0.1; done & tail -f /tmp/dmesg.log


Per favore, puoi spiegare perché questa è una soluzione.
ChrisF

È ciò che fanno alcune distribuzioni dietro le quinte. Esegue il polling del kernel ringbuffer e lo registra in /tmp/dmesg.log ogni 0,1 secondi in un processo in background mentre codifica l'output. Inoltre, è l'unico metodo che funzionerà se non hai qualcosa di speciale in esecuzione in background o se hai ucciso tutti i processi e servizi in background e stai facendo una risoluzione dei problemi di emergenza.
Dagelf,

1
Sembra più semplice da usarewatch
poolie

Se ce l'hai a disposizione :-) a volte ti trovi in ​​un ambiente in cui non hai nemmeno la coda ... allora puoi usare cat /tmp/dmesg.log o dd persino ... Se non riesci a scrivere su / tmp, e non è possibile montare -t tmpfs - / tmp, o ramfs, o scrivere su / dev / shm / ... quindi si può semplicemente mentre dmesg -c; dormire 0,1; do echo> / dev / null; fatto, se non dormi, solo mentre dmesg -c; do echo> / dev / null; fatto; A volte non hai nemmeno ls ... allora fai solo eco * :-D
Dagelf

2

Uso questo alias in /root/.bashrc;

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

che segue dmesg e regola le linee per qualunque terminale venga chiamato.


0

Sotto l'attuale Ubuntu (sto usando Ubuntu 12.04),

tail -f /var/log/syslog

può soddisfare il requisito.


0

Ho usato questo codice per cercare un evento del kernel speciale e ho inviato un processo di "callback":

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

-2

risposta a una vecchia domanda, ma qualcuno potrebbe trovarla utile :)

dmesg | tail -f -

convoglia l'output di dmesg attraverso tail usando l'operatore - come scorciatoia per stdout


2
Questo è il codice della domanda che non funziona.
pabouk,

2
Non funziona perché dmesgchiude l'output dopo aver chiuso una volta. tail -fnon posso più cambiarlo.
Daniel Alder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.