Sto scrivendo un driver di dispositivo che stampa il messaggio di errore in ring buffer dmesg output. Voglio vedere l'output di dmesg
mentre cambia.
Come posso fare questo?
Versioni dmesg
relativamente recenti fornire un'opzione follow (-w
, --follow
) che funziona in modo analogo a tail -f
.
Quindi, basta usare il seguente comando:
$ dmesg -wH
(-H
, --human
abilita funzioni intuitive come colori, tempo relativo)
Queste opzioni sono disponibili ad esempio in Fedora 19.
Puoi usare il comando watch
che è destinato esattamente a cose del genere
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
la parte $((LINES-6))
dovrebbe adattarsi perfettamente al tuo terminale.
Non è possibile monitorare direttamente l'output di dmesg
.
Tuttavia, è molto probabile che il tuo 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 il tuo syslog
ha delle impostazioni sane (ad esempio quelle predefinite), molto probabilmente questi messaggi verranno visualizzati anche nel kern.log
logfile.
Quindi puoi fare qualcosa come:
tail -f /var/log/kern.log
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
fa output del contenuto di quel ring buffer. Se fate dmesg -c
in seguito cancellerà anche il ring buffer.
Pertanto potresti fare qualcosa come while true; do dmesg -c; sleep 1; done
avere qualcosa come l'equivalente di un non funzionante dmesg|tail
. Ma questo cancella il buffer dell'anello e quindi ha bisogno dei poteri di root.
L'altro modo è il file /proc/kmsg
che consente una vista sul buffer dell'anello. Potresti 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.)
Quindi dai un'occhiata a /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, come BusyBox che è 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 l'output di dmesg sullo schermo mentre gli eventi cambiano, un semplice ciclo Bash funziona bene. Non è l'ideale, ma come ho già detto sul dmesg di 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 loop con Ctrl + C. Lo sleep 1 serve a fermarlo a battere inutilmente la CPU, e il flag -c cancella il buffer ad ogni chiamata in modo da non vedere un output ripetuto ogni secondo.
Sui sistemi che utilizzano systemd
puoi anche:
# journalctl -kf
Utilizzare questi due comandi da terminali separati:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Otterrà un risultato simile.