wake-up-neo.net

Come posso vedere l'output di dmesg mentre cambia?

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?

154
Milad Khajavi

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.

194
maxschlepzig

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.

57
peterph

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
12
umläute

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.

10
michas

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.

8
user241342

Sui sistemi che utilizzano systemd puoi anche:

# journalctl -kf
5
Maxim

Utilizzare questi due comandi da terminali separati:

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

Otterrà un risultato simile.

0
K_K