¿Quieres hacer algo como
dmesg | tail -f
pero no funciona: uso Mac OSX 10.6.7, haciendo que la cola salga, en lugar de monitorear la salida.
Me pregunto si hay alguna forma de hacerlo, o algún comando equivalente. PD, no creo que un while
bucle sea una buena idea.
bash
command-line
tail
Ivan ZG Xiao
fuente
fuente
kernel.log
no contiene el mismo resultado quedmesg
. Por ejemplo, para una unidad dañada, los errores de lectura de archivosdmesg
especifican exactamente qué archivo no se pudo leer, mientras quekernel.log
desafortunadamente solo proporciona un aviso poco útil:disk0s2: I/O error.
Respuestas:
Probablemente esté buscando alguna combinación de mensajes de varios archivos de registro. Tratar:
... para obtener una buena visión general del sistema. Si desea más o menos que eso, investigue en qué archivo de registro se colocan los mensajes que desea ver.
También busque el uso
multitail
de archivos y códigos de colores y filtre varios archivos de registro a la vez.Editar: Esto no fue muy relevante cuando respondí esto, pero como esta página recibe muchos éxitos, creo que vale la pena mencionar que los sistemas más nuevos que ejecutan systemd tienen esto.
fuente
multitail
. Parece interesante. En el caso de OS X que va a ser algo así como:tail -f /var/log/{system.log,kernel.log}
.system.log
ykernel.log
no contienen el resultado exacto dedmesg
en OS X. Por ejemplo, para una unidad dañada, los errores de lectura de archivosdmesg
especifican exactamente qué archivo no se pudo leer, mientras quekernel.log
desafortunadamente solo proporciona un aviso poco útil:disk0s2: I/O error.
Solo hazlo @ # $% ing trabajo
man dmesg
)/proc/kmsg
(verman proc
)/proc/kmsg
directamente, es decircat /proc/kmsg
.Ahora, si lee el amigable manual de proceso, le advertirá severamente que permita que solo un usuario (que debe tener privilegios) lea
/proc/kmsg
a la vez. Cualquier implementación de syslog que tenga debe estar haciendo esto, y presumiblemente funcionadmesg
. No sé, estoy fuera de mi alcance aquí, solo parafraseando el manual. Entonces, si bien esta es la forma de "simplemente hacer que funcione en # # $% ing", considere primero los siguientes dos métodos.Página de manual aprobada: ver + dmesg
En Arch gnu / linux con systemd init *, dmesg.log no se escribe con mucha frecuencia, ¿tal vez en absoluto? La mejor manera que encontré para leer el búfer de registro del núcleo continuamente es con
watch
. Algo como esto debería ayudarlo a comenzar (ajuste la cantidad de líneas que caben en su terminal):ver + dmesg + daemon + tail -f
Una solución más complicada podría usar watch para escribir la salida de dmesg en el archivo, que luego podría usar
tail -f
. Probablemente quieras que esto funcione como un demonio. Un demonio adecuado también gzip y gire los registros. El siguiente código bash no se ha probado, no funciona y solo pretende transmitir una idea. La respuesta de @Brooks Moses tiene una versión funcional .* tangente, porque esta es una pregunta de osx, pero cuando systemd está cerca, no te molestes
dmesg
, usajournalctl -xf
(quizás w /-n 100
para mostrar también las 100 líneas anteriores)fuente
/proc
, sin embargo, el resto de su respuesta es aplicable.watch
se puede instalar desde MacPorts: macports.orgdmesg
implementación de Apple : opensource.apple.com/source/system_cmds/system_cmds-230.7/… Quick Googling no menciona nada sobre su representación en el sistema de archivos: /Para aquellos interesados en Linux, desde kernel kernel 3.5.0:
También en sistemas con
systemd
usted puede:fuente
dmesg -w
Es la mejor solución. Desafortunadamente, incluso Ubuntu 14.04 no parece estar listo para esto porque la herramienta de espacio de usuario aún no lo admite.Aquí hay una variante de la respuesta de djeikyb que realmente se prueba y corrige un par de errores.
El truco importante es que lo estamos haciendo
dmesg -c
, lo que borra el búfer de anillo después de que se imprime; por lo tanto, cada vez que solo imprimimos lo que es nuevo desde la última vez. Tendrá que ser root para hacer eso, por lo tanto, elsudo
. También hay una corrección de errores; en lugar de intentar volcar la salida en un archivo y canalizarla hacia la cola (que no funciona), solo estamos leyendo el archivo recién escrito.Podríamos hacer solo
dmesg > /tmp/dmesg.log
y sobrescribir el archivo completo en cada iteración, pero eso es una gran cantidad de E / S y también corre el riesgo de perder el archivo si la computadora se bloquea en medio de una sobrescritura.También podría hacer algo similar, más parecido
tail -f
a un ciclo while que se ejecutadmesg -c
ysleep 1
para siempre (vea la respuesta de Ben Harris). Sin embargo, dado que esto en realidad está borrando el búfer de mensajes del núcleo mientras se está ejecutando, es posible que también desee canalizar las cosas en un archivo de registro en caso de que las desee más adelante.fuente
Esto puede funcionar para usted
Tenga en cuenta que el indicador '-c' borra el búfer de mensajes en stdout. El 'sudo' es innecesario si eres root. Si cree que esto está consumiendo demasiado de su recurso de CPU, intente agregar un 'sueño 1' antes de que finalice el ciclo.
fuente
Hice esto antes de ver esta publicación:
fuente
es posible que pueda hacer:
fuente
dmesg
informa un conjunto actual de los últimos mensajes del núcleo, generalmente específicos de los subsistemas de hardware.fuente
watch
Yo uso este alias en /root/.bashrc;
que sigue a dmesg y ajusta las líneas para cualquier terminal en el que se llame.
fuente
Bajo el Ubuntu actual (estoy usando Ubuntu 12.04),
Puede cumplir con el requisito.
fuente
Usé este código para buscar un evento especial del kernel y lo canalicé un proceso de "devolución de llamada":
fuente
respuesta a una pregunta anterior, pero alguien podría encontrarla útil :)
canaliza la salida de dmesg a través de la cola utilizando el operador - como acceso directo a stdout
fuente
dmesg
cierra la salida después de cerrar una vez.tail -f
No puedo cambiar esto más.