Come posso vedere l'output di dmesg mentre cambia?


Risposte:


178

Le dmesgversioni relativamente recenti forniscono un'opzione follow ( -w, --follow) che funziona in modo analogo a tail -f.

Quindi, basta usare il seguente comando:

$ dmesg -wH

( -H, --humanabilita funzionalità intuitive come colori, tempo relativo)

Queste opzioni sono disponibili ad esempio in Fedora 19.


2
Bella scoperta! Gentoo non brontola -Hma per il resto è
perfetto

Gli strumenti dello spazio utente devono essere la versione 2.22+. Gli utenti di Ubuntu devono attendere la versione 14.10 "utopica"
Daniel Alder,

1
Ubuntu non fa grok -w - è necessario usare watch (sotto)
Brent Faust

2
Sorprendi una risposta di amministratore di sistema che utilizza flag - descrittivamente-nominati anziché flag criptici a carattere singolo. BRAVO, SIR. BRAVO.
codice alleato

1
-wdovrebbe funzionare in ogni versione di Ubuntu da Utopic (14.10) in poi. ( launchpad.net/ubuntu/+source/util-linux/+publishinghistory suggerisce che i primi pacchetti Utopic fossero per 2.20, ma raggiunsero 2.25 quando fu rilasciato.)
mwfearnley

54

Puoi usare il watchcomando che è destinato esattamente a cose del genere

watch -n 0.1 "dmesg | tail -n $((LINES-6))"

la $((LINES-6))parte dovrebbe adattarsi perfettamente al tuo terminale.


2
Se usi virgolette singole anziché doppie (o sfuggi al segno del dollaro), otterrai un nuovo valore di $ LINES per ogni chiamata, quindi si adatterà se cambi le dimensioni del tuo terminale.
P Daddy,

Le virgolette singole inibiranno l'espansione variabile. Inoltre, la variabile viene espansa solo una volta in questo esempio - su invocazione di watch. Quindi non cambierà davvero tra le invocazioni di dmesg. Bisognerebbe usare un wrapper che interrogasse lo stato del terminale.
peterph

2
Questo è il punto. Le virgolette singole vietano l'espansione della variabile quando la shell passa gli argomenti watch, quindi watch eseguirà il comando con l'espressione della variabile presente, che verrà espansa dalla shell che invoca. Ogni volta. Provalo, funziona.
P Daddy,

Hmm, hai ragione - presumo watchusi popen(), il che significa che viene generata un'altra shell e la variabile d'ambiente viene quindi fornita da essa (e quindi aggiornata ad ogni esecuzione). Bella scoperta.
peterph

12

non puoi davvero monitorare l'output di dmesgdirettamente.

tuttavia, è molto probabile che il modulo non stia stampando direttamente nel ring-buffer di dmesg, ma utilizzi invece le funzionalità di registrazione del kernel (che verranno quindi visualizzate da dmesg). se hai syslogdelle impostazioni sane (ad es. quelle di default), molto probabilmente questi messaggi verranno mostrati nel kern.logfile di log.

così puoi fare qualcosa come:

 tail -f /var/log/kern.log

/var/log/kern.logè abbastanza specifico per Linux. Per OpenBSD (e possibilmente altri) le cose di dmesg vengono registrate in / var / log / messages. Certo, ci sono anche altre cose lì.
Kurtm,

2
tail -f /var/log/{messages,kernel,dmesg,syslog}tramite superutente: è-possibile-a-coda-f-l'output-di-dmesg
qui

9

Si utilizza dmesgper ottenere i messaggi di registro del kernel.

Il kernel stesso accede a un buffer ad anello, cioè solo in memoria. Ora tutto dmesgciò che fa è produrre il contenuto di quel ring buffer. Se lo fai dmesg -c, cancellerai anche il ring buffer in seguito.

Quindi potresti fare qualcosa come while true; do dmesg -c; sleep 1; doneavere qualcosa come l'equivalente di un non funzionare dmesg|tail. Ma questo cancella il ring buffer e quindi ha bisogno dei poteri di root.

L'altro modo è il file /proc/kmsgche consente una vista sul ring buffer. Si potrebbe fare tail -f /proc/kmsg, ma ciò consente solo un processo e di solito si tratta del demone di registrazione. - Il suo compito è leggere i messaggi e scriverli su file reali (di solito in / var / log) dove possono essere letti. Può essere configurato per emettere tutti i messaggi in un singolo file o parti diverse in file diversi. (Ma la configurazione dipende dal demone di registrazione del tuo sistema.)

Pertanto, controlla /var/logse esiste un file adatto alle tue esigenze e configura il tuo demone di registrazione in caso contrario.


//, Sul sistema CEntOS 6 che sto usando, la coda e la visualizzazione / proc / kmsg non producono alcun output. [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
Nathan Basanese

8

Se si utilizza un sistema incorporato, la busybox comune su sistemi come OpenWRT ha funzionalità molto limitate e sono supportati solo 2-3 flag.

Se vuoi un modo rapido e sporco di stampare continuamente sullo schermo l'output di dmesg mentre gli eventi cambiano, un semplice ciclo bash funziona bene. Non è l'ideale ma, come ho già detto, nel dmesg BusyBox mancano molte funzioni. Trovo che quanto segue abbia lo stesso effetto quando si accede alla riga di comando:

$ while true; do dmesg -c ; sleep 1 ; done

puoi uscire dal ciclo con Ctrl-C lo sleep 1 è per fermarlo a battere inutilmente la CPU, e il flag -c cancella il buffer su ogni chiamata in modo da non vedere un output ripetuto ogni secondo,


1
Davvero utile per il debug di Android.
val

5

Su sistemi che usano systemdpuoi anche:

# journalctl -kf

1
Ubuntu 14.10: ➜ ~ journalctl -kf Nessun file journal trovato.
Nathan Basanese,

0

Utilizzare questi 2 comandi da terminali separati:

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

Otterrà un risultato simile.


//, Questo in sostanza indica a dmesg di aggiungere l'output a test.txt, giusto? E il secondo comando guarda solo quel file test.txt?
Nathan Basanese,

Grazie .. sì .. il 2 ° comando osserva le modifiche a dmesg. cat / proc / kmsg può ottenere un output simile ma non salva i log in un file.
K_K,
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.