¿Cómo puedo ver la salida de dmesg a medida que cambia?

141

Estoy escribiendo un controlador de dispositivo que imprime un mensaje de error en la salida dmesg del búfer en anillo . Quiero ver la salida de a dmesgmedida que cambia.

¿Cómo puedo hacer esto?

Milad Khajavi
fuente
1
superuser.com/questions/289239/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

178

Las dmesgversiones relativamente recientes proporcionan una opción de seguimiento ( -w, --follow) que funciona de forma análoga a tail -f.

Por lo tanto, solo use el siguiente comando:

$ dmesg -wH

( -H, --humanpermite funciones fáciles de usar como colores, tiempo relativo)

Esas opciones están disponibles, por ejemplo, en Fedora 19.

maxschlepzig
fuente
2
Buen hallazgo! Gentoo no grok -Hpero por lo demás
acerta
Las herramientas de espacio de usuario deben ser la versión 2.22+. Los usuarios de Ubuntu tienen que esperar la versión 14.10 "utópica"
Daniel Alder
1
Ubuntu no grok -w - necesita usar watch (abajo)
Brent Faust
2
Wow, una respuesta de administrador de sistemas que usa --designtively-named-flags en lugar de banderas crípticas de un solo carácter. Bravo, señor. BRAVO.
allyourcode
1
-wdebería funcionar en todas las versiones de Ubuntu desde Utopic (14.10) en adelante. ( Launchpad.net/ubuntu/+source/util-linux/+publishinghistory sugiere paquetes de primeros Utopic eran de 2,20, pero llegaron a 2,25 en el momento en que fue lanzado.)
mwfearnley
54

Puede usar el watchcomando que está destinado exactamente para cosas como esta

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

la $((LINES-6))parte debe hacer que encaje bien en su terminal.

Peterph
fuente
2
Si usa comillas simples en lugar de comillas dobles (o escapa del signo del dólar), obtendrá un nuevo valor de $ LÍNEAS para cada invocación, por lo que se ajustará si cambia el tamaño de su terminal.
P Daddy
Las comillas simples inhibirán la expansión variable. Por otra parte, la variable se expande sólo una vez en este ejemplo - la invocación de watch. Por lo tanto, no cambiará realmente entre invocaciones de dmesg. Uno necesitaría usar un contenedor que consultaría el estado del terminal.
Peter
2
Ese es todo el punto. Las comillas simples prohíben la expansión de la variable cuando el shell pasa los argumentos a watch, por lo tanto, watch ejecutará el comando con la expresión variable allí, que será expandida por el shell que invoca. Cada vez. Pruébalo, funciona.
P Daddy
Hmm, tienes razón: supongo que watchutiliza popen(), lo que significa que se genera otro shell y luego la variable de entorno es suministrada por él (y, por lo tanto, se actualiza en cada ejecución). Buen hallazgo
Peter
12

realmente no puedes monitorear la salida de dmesgdirectamente.

sin embargo, hay muchas posibilidades de que su módulo no imprima directamente en el búfer de anillo de dmesg, sino que utilice las funciones de registro del núcleo (que luego se mostrarán en dmesg). Si syslogtiene alguna configuración sensata (por ejemplo, predeterminada), lo más probable es que estos mensajes también aparezcan en el kern.logarchivo de registro.

para que puedas hacer algo como:

 tail -f /var/log/kern.log
umläute
fuente
/var/log/kern.loges bastante específico de Linux. Para OpenBSD (y posiblemente otros), el material dmesg se registra en / var / log / messages. Por supuesto, algunas otras cosas también van allí.
kurtm
2
tail -f /var/log/{messages,kernel,dmesg,syslog}a través del superusuario: es posible seguir la salida de dmesg
aquí
9

Se utiliza dmesgpara obtener mensajes de registro del núcleo.

El núcleo en sí se registra en un búfer en anillo, es decir, solo en la memoria. Ahora todo lo que dmesghace es generar el contenido de ese búfer de anillo. Si lo hace dmesg -c, también eliminará el búfer de anillo después.

Por lo tanto, podría hacer algo como while true; do dmesg -c; sleep 1; donetener algo como el equivalente de un no funciona dmesg|tail. Pero esto elimina el búfer de anillo y, por lo tanto, necesita poderes de raíz.

La otra forma es el archivo /proc/kmsgque permite una vista en el búfer de anillo. Podría hacerlo tail -f /proc/kmsg, pero esto solo permite un proceso, y este suele ser su demonio de registro. - Su trabajo es leer los mensajes y escribirlos en archivos reales (generalmente en / var / log) donde puedan leerse. Se puede configurar para enviar todos los mensajes a un solo archivo o diferentes partes en diferentes archivos. (Pero la configuración depende del daemon de registro de su sistema).

Por lo tanto, observe /var/logsi hay algún archivo que se adapte a sus necesidades y configure su demonio de registro de otra manera.

michas
fuente
//, en el sistema CEntOS 6 que estoy usando, seguir y ver / proc / kmsg no produce resultados. [~] $ sudo tail -f / proc / kmsg ♥% [~] $ sudo cat / proc / kmsg ♥% [~] $
Nathan Basanese
8

Si está utilizando un sistema integrado, el busybox que es común en sistemas como OpenWRT tiene una funcionalidad muy limitada y solo se admiten 2-3 indicadores.

Si desea una forma rápida y sucia de imprimir resultados dmesg en pantalla continuamente a medida que los eventos cambian, un simple bash loop funciona bien. No es ideal, pero como mencioné, al dmesg de BusyBox le faltan muchas funciones. Creo que lo siguiente tiene el mismo efecto cuando se ingresa en la línea de comando:

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

puede salir del bucle con Ctrl-C, el modo de suspensión 1 es evitar que golpee la CPU innecesariamente, y el indicador -c borra el búfer en cada llamada para que no vea salidas repetidas cada segundo,

usuario241342
fuente
1
Realmente útil para depurar Android.
val
5

En los sistemas que usan systemdtambién puede:

# journalctl -kf
Máxima
fuente
1
Ubuntu 14.10: ➜ ~ journalctl -kf No se encontraron archivos de diario.
Nathan Basanese
0

Utilice estos 2 comandos desde terminales separados:

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

Logrará un resultado similar.

K_K
fuente
//, esto básicamente le indica a dmesg que agregue resultados a test.txt, ¿verdad? ¿Y el segundo comando solo mira ese archivo test.txt?
Nathan Basanese
Gracias ... sí ... el segundo comando observa los cambios a dmesg. cat / proc / kmsg puede lograr una salida similar pero no guarda los registros en un archivo.
K_K