Sto scrivendo un driver di dispositivo che stampa un messaggio di errore nell'output dmesg del buffer dell'anello . Voglio vedere l'output di dmesgcome 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 dmesgcome cambia.
Come posso fare questo?
Risposte:
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.
-Hma per il resto è
-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.)
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.
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.
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.
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ì.
tail -f /var/log/{messages,kernel,dmesg,syslog}tramite superutente: è-possibile-a-coda-f-l'output-di-dmesg
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.
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 systemdpuoi anche:
# journalctl -kf
Utilizzare questi 2 comandi da terminali separati:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtOtterrà un risultato simile.