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?
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?
Respuestas:
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.
-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 esta
watch -n 0.1 "dmesg | tail -n $((LINES-6))"
la $((LINES-6))parte debe hacer que encaje bien en su terminal.
watch. Por lo tanto, no cambiará realmente entre invocaciones de dmesg. 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.
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
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
/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 dmesg
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.
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,
En los sistemas que usan systemdtambién puede:
# journalctl -kf
Utilice estos 2 comandos desde terminales separados:
while true; do dmesg -c >> test.txt;sleep 1; donetail -f test.txtLogrará un resultado similar.