¿Es posible `tail -f` la salida de` dmesg`?

137

¿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 whilebucle sea una buena idea.

Ivan ZG Xiao
fuente
eso funciona bien en mi caja Ubuntu 10.04LTS. Una solución alternativa sería ajustar cualquier archivo de registro en el que syslog esté poniendo los mensajes del núcleo.
44
En Mac OSX, ese archivo es /var/log/kernel.log
1
@ Anónimo 2: Desafortunadamente, kernel.logno contiene el mismo resultado que dmesg. Por ejemplo, para una unidad dañada, los errores de lectura de archivos dmesgespecifican exactamente qué archivo no se pudo leer, mientras que kernel.logdesafortunadamente solo proporciona un aviso poco útil:disk0s2: I/O error.
Ivan Vučica
3
Desde linux 3.5, puedes hacer dmesg -w.
Doug Richardson
2
unix.stackexchange.com/questions/95842/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

120

Probablemente esté buscando alguna combinación de mensajes de varios archivos de registro. Tratar:

tail -f /var/log/{messages,kernel,dmesg,syslog}

... 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 multitailde 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.

dmesg -w
Caleb
fuente
55
Gracias por el heads-up Re: multitail. Parece interesante. En el caso de OS X que va a ser algo así como: tail -f /var/log/{system.log,kernel.log}.
boehj
2
system.logy kernel.logno contienen el resultado exacto de dmesgen OS X. Por ejemplo, para una unidad dañada, los errores de lectura de archivos dmesgespecifican exactamente qué archivo no se pudo leer, mientras que kernel.logdesafortunadamente solo proporciona un aviso poco útil:disk0s2: I/O error.
Ivan Vučica
3
Para el registro, esta respuesta no funciona en OS X Mavericks (10.9) o Arch Linux.
Elle Mundy
@Dan On Arch probablemente no tenga un demonio syslog instalado o su servicio habilitado. Me di cuenta de que no es parte del conjunto de paquetes base, aunque es bastante fundamental. OSX está basado en BSD y tiene diferentes caminos para muchas cosas. Tendrá que descubrir cómo y dónde su sistema maneja el registro y el ajuste. Mi respuesta es bastante genérica y cubre la mayoría de las distribuciones basadas en FHS con syslog habilitado, pero también hay muchas implementaciones variantes.
Caleb
1
++ en la edición.
pstanton
56

Solo hazlo @ # $% ing trabajo

  1. Desea imprimir la salida de dmesg, constantemente, inmediatamente
  2. Dmesg está imprimiendo el buffer del anillo del núcleo (ver man dmesg)
  3. El búfer de anillo del núcleo es un archivo de proceso especial, /proc/kmsg(ver man proc)
  4. Leer /proc/kmsgdirectamente, es decir cat /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/kmsga la vez. Cualquier implementación de syslog que tenga debe estar haciendo esto, y presumiblemente funciona dmesg. 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):

watch 'dmesg | tail -50'

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 .

watch 'dmesg >> /var/log/dmesg.log | tail -1'

* tangente, porque esta es una pregunta de osx, pero cuando systemd está cerca, no te molestes dmesg, usa journalctl -xf(quizás w / -n 100para mostrar también las 100 líneas anteriores)

djeikyb
fuente
1
OS X no tiene /proc, sin embargo, el resto de su respuesta es aplicable. watchse puede instalar desde MacPorts: macports.org
Ivan Vučica
@ Ivan Vučica Ah, es bueno saberlo. Pregunto dónde OSX representa el búfer de anillo del núcleo ..
djeikyb
2
Parece que está directamente en la memoria del núcleo. Código fuente para la dmesgimplementació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: /
Ivan Vučica
42

Para aquellos interesados ​​en Linux, desde kernel kernel 3.5.0:

# dmesg -w

También en sistemas con systemdusted puede:

# journalctl -kf
Máxima
fuente
66
dmesg -wEs 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.
Daniel Alder
1
Esta respuesta definitivamente merece más votos a favor ahora.
m4tx
2
Sí, esta es una pequeña pepita agradable. puede hacerse legible para humanos con: dmesg -wH
faustus
21

Aquí hay una variante de la respuesta de djeikyb que realmente se prueba y corrige un par de errores.

watch 'sudo dmesg -c >> /tmp/dmesg.log; tail -n 40 /tmp/dmesg.log'

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, el sudo. 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.logy 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 -fa un ciclo while que se ejecuta dmesg -cy sleep 1para 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.

Brooks Moses
fuente
6

Esto puede funcionar para usted

while true;do sudo dmesg -c;done

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
el reloj podría ser bueno allí, si estás mirando la pantalla todo el tiempo
Seth Robertson
2
Siéntase libre de citar sus fuentes: linuxforums.org/forum/applications/…
2
Rápido y sucio. Sucio porque solo funciona si eres el único usuario que hace esto. De lo contrario, cada usuario recibe solo la mitad de los mensajes
Daniel Alder
resuelve mi problema de Android ADB.
PAntoine
5

Hice esto antes de ver esta publicación:

#!/usr/bin/env perl

use strict;
use warnings;

# "tail -f" for dmesg
# Keeps last printed line. Anything sorting "gt" will be newer

$|=1;

my $y = '';

while(1) {
    for my $k (`dmesg`) {
        if ($k gt $y) {
            print $k;
            $y = $k;
        }
    }        
    sleep 1;
}
exit;
Mecánica cuántica
fuente
3

es posible que pueda hacer:

tail -f /var/log/messages
Ed L
fuente
2
En la mayoría de los sistemas, el archivo de registro dmesg es solo un volcado estático del búfer dmesg una vez que se completa el arranque del sistema. Después de eso, los mensajes nuevos del kernel generalmente van a otro archivo de registro y el archivo dmesg permanecerá sin cambios hasta que se reinicie.
77
No sé acerca de "la mayoría" de los sistemas, pero ninguno de los sistemas GNU Linux que administro se comportan de esa manera. dmesginforma un conjunto actual de los últimos mensajes del núcleo, generalmente específicos de los subsistemas de hardware.
Caleb
3

mientras que dmesg -c >> /tmp/dmesg.log; duerme 0.1; hecho y cola -f /tmp/dmesg.log

Dagelf
fuente
¿Puede explicar por qué esta es una solución?
ChrisF
Es lo que hacen algunas distribuciones detrás de escena. Sondea el búfer de anillo del núcleo y lo registra en /tmp/dmesg.log cada 0.1 segundos en un trabajo en segundo plano mientras sigue esa salida. Además, es el único método que funcionará si no tiene algo especial ejecutándose en segundo plano, o si ha eliminado todos los procesos y servicios en segundo plano y está haciendo una solución de problemas de emergencia.
Dagelf
1
Parece más fácil de usarwatch
poolie
Si lo tienes disponible :-) a veces estás en un entorno donde ni siquiera tienes cola ... entonces puedes usar cat /tmp/dmesg.log, o dd incluso ... Si no puedes escribir a / tmp, y no puede montar -t tmpfs - / tmp, o ramfs, o escribir en / dev / shm / ... entonces puede hacerlo mientras dmesg -c; dormir 0.1; hacer eco> / dev / null; hecho, si no has dormido, solo mientras dmesg -c; hacer eco> / dev / null; hecho; A veces ni siquiera tienes ls ... entonces solo haces eco * :-D
Dagelf
2

Yo uso este alias en /root/.bashrc;

alias dwatch='watch -n 0.1 "dmesg | tail -n $((LINES-6))"'

que sigue a dmesg y ajusta las líneas para cualquier terminal en el que se llame.

drgibbon
fuente
0

Bajo el Ubuntu actual (estoy usando Ubuntu 12.04),

tail -f /var/log/syslog

Puede cumplir con el requisito.

Bill Zhao
fuente
0

Usé este código para buscar un evento especial del kernel y lo canalicé un proceso de "devolución de llamada":

while true ; do dmesg -c ; sleep .1 ; done \
| grep --line-buffered  -o $pattern \
| ... 
rzr
fuente
-2

respuesta a una pregunta anterior, pero alguien podría encontrarla útil :)

dmesg | cola -f -

canaliza la salida de dmesg a través de la cola utilizando el operador - como acceso directo a stdout

Random Linux Dood
fuente
2
Este es el código de la pregunta que no funciona.
pabouk
2
No funciona porque dmesgcierra la salida después de cerrar una vez. tail -fNo puedo cambiar esto más.
Daniel Alder