Sto scrivendo un driver di dispositivo che stampa un messaggio di errore nell'output dmesg del buffer dell'anello . Voglio vedere l'output di dmesg
come cambia.
Come posso fare questo?
Sto scrivendo un driver di dispositivo che stampa un messaggio di errore nell'output dmesg del buffer dell'anello . Voglio vedere l'output di dmesg
come cambia.
Come posso fare questo?
Risposte:
Le dmesg
versioni 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
, --human
abilita funzionalità intuitive come colori, tempo relativo)
Queste opzioni sono disponibili ad esempio in Fedora 19.
-H
ma per il resto è
-w
dovrebbe 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.)
Puoi usare il watch
comando 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.
watch
. Quindi non cambierà davvero tra le invocazioni di dmesg
. Bisognerebbe usare un wrapper che interrogasse lo stato del terminale.
watch
, quindi watch eseguirà il comando con l'espressione della variabile presente, che verrà espansa dalla shell che invoca. Ogni volta. Provalo, funziona.
watch
usi 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.
non puoi davvero monitorare l'output di dmesg
direttamente.
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 syslog
delle impostazioni sane (ad es. quelle di default), molto probabilmente questi messaggi verranno mostrati nel kern.log
file 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ì.
tail -f /var/log/{messages,kernel,dmesg,syslog}
tramite superutente: è-possibile-a-coda-f-l'output-di-dmesg
Si utilizza dmesg
per ottenere i messaggi di registro del kernel.
Il kernel stesso accede a un buffer ad anello, cioè solo in memoria. Ora tutto dmesg
ciò 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; done
avere 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/kmsg
che 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/log
se esiste un file adatto alle tue esigenze e configura il tuo demone di registrazione in caso contrario.
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,
Su sistemi che usano systemd
puoi anche:
# journalctl -kf
Utilizzare questi 2 comandi da terminali separati:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Otterrà un risultato simile.