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?
linux
command-line
logs
dmesg
Milad Khajavi
fuente
fuente
Respuestas:
Las
dmesg
versiones 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
,--human
permite funciones fáciles de usar como colores, tiempo relativo)Esas opciones están disponibles, por ejemplo, en Fedora 19.
fuente
-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 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.watch
utilizapopen()
, 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
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
). Sisyslog
tiene alguna configuración sensata (por ejemplo, predeterminada), lo más probable es que estos mensajes también aparezcan en elkern.log
archivo de registro.para que puedas hacer algo como:
fuente
/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 dmesgSe 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 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; done
tener 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/kmsg
que 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/log
si 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
systemd
también puede:fuente
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.
fuente