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 dmesg
medida 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 dmesg
medida que cambia.
¿Cómo puedo hacer esto?
Respuestas:
Las dmesg
versiones 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
, --human
permite funciones fáciles de usar como colores, tiempo relativo)
Esas opciones están disponibles, por ejemplo, en Fedora 19.
-H
pero por lo demás
-w
deberí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 watch
comando 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.
watch
utiliza 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 dmesg
directamente.
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 syslog
tiene alguna configuración sensata (por ejemplo, predeterminada), lo más probable es que estos mensajes también aparezcan en el kern.log
archivo de registro.
para que puedas hacer algo como:
tail -f /var/log/kern.log
/var/log/kern.log
es 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 dmesg
para 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 dmesg
hace 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; done
tener 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/kmsg
que 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/log
si 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 systemd
también puede:
# journalctl -kf
Utilice estos 2 comandos desde terminales separados:
while true; do dmesg -c >> test.txt;sleep 1; done
tail -f test.txt
Logrará un resultado similar.