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?
linux
command-line
logs
dmesg
Milad Khajavi
fuente
fuente

Respuestas:
Las
dmesgversiones relativamente recientes proporcionan una opción de seguimiento (-w,--follow) que funciona de forma análoga atail -f.Por lo tanto, solo use el siguiente comando:
(
-H,--humanpermite funciones fáciles de usar como colores, tiempo relativo)Esas opciones están disponibles, por ejemplo, en Fedora 19.
fuente
-Hpero por lo demás-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.)Puede usar el
watchcomando que está destinado exactamente para cosas como estala
$((LINES-6))parte debe hacer que encaje bien en su terminal.fuente
watch. Por lo tanto, no cambiará realmente entre invocaciones dedmesg. Uno necesitaría usar un contenedor que consultaría el estado del terminal.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.watchutilizapopen(), 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 hallazgorealmente 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). Sisyslogtiene alguna configuración sensata (por ejemplo, predeterminada), lo más probable es que estos mensajes también aparezcan en elkern.logarchivo de registro.para que puedas hacer algo como:
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í.tail -f /var/log/{messages,kernel,dmesg,syslog}a través del superusuario: es posible seguir la salida de dmesgSe 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 hacedmesg -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 funcionadmesg|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 hacerlotail -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.fuente
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:
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,
fuente
En los sistemas que usan
systemdtambién puede:fuente
Utilice estos 2 comandos desde terminales separados:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtLogrará un resultado similar.
fuente