Me gustaría leer mi dmesg Centos 5.x con marca de tiempo, ¿cómo hago esto?
dmesg -T
Me gustaría leer mi dmesg Centos 5.x con marca de tiempo, ¿cómo hago esto?
dmesg -T
Respuestas:
dmesg
lee el búfer de anillo de registro de Kernel. No hace marcas de tiempo. Lo que debe hacer es configurar syslog para tomar los registros del núcleo de ese búfer y enviarlos a un archivo (si aún no está configurado para hacerlo). Tenga en cuenta que, por /var/log/messages
lo que recuerdo , la configuración predeterminada de syslog de CentOS 5.x envía registros del kernel .
Si desea enviar todos los registros del kernel (dmesg) a /var/log/kern.log
, utilizando el demonio syslog predeterminado, agregará una línea como la siguiente a/etc/syslog.conf
kern.* /var/log/kern.log
/etc/rsyslog.conf
Hay una solución "Habilitar marcas de tiempo para dmesg / Kernel Ring Buffer"
Puedes agregar:
printk.time=1
kernel cmdline.
En cuanto a mí, he agregado a rc.local en todas las máquinas con títeres. Es más fácil para mí):
if test -f /sys/module/printk/parameters/time; then
echo 1 > /sys/module/printk/parameters/time
fi
rc.local
es realmente una solución fea para esto (usar rc.local
es casi siempre una solución fea para cualquier cosa). Una mejor solución sería poner o printk.time = 1
ingresar /etc/sysctl.conf
un archivo /etc/sysctl.d/
. Esa es la razón por la que existen estos archivos. Al meter cosas rc.local
, eventualmente te dejará con una puesta en marcha frágil, enrevesada, desordenada y poco confiable.
He escrito este simple guión. Si, es lento. Si quieres algo más rápido, puedes escribir un script en Perl, Python o algo más. Estoy seguro de que este simple script puede darle la idea de cómo se puede calcular.
Tenga en cuenta que ignoré la fracción de segundos registrada en cada línea (después de. En la marca de tiempo).
#!/bin/bash
localtime() {
perl -e "print(localtime($1).\"\n\");";
}
upnow="$(cut -f1 -d"." /proc/uptime)"
upmmt="$(( $(date +%s) - ${upnow} ))"
dmesg | while read line; do
timestamp="$(echo "${line}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")"
timestamp=$(( ${timestamp} + ${upmmt} ))
echo "${line}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
done
Espero que ayude. :)
La modificación del script en la línea de caso no comienza con un "["
#!/bin/bash
localtime() {
perl -e "print(localtime($1).\"\n\");";
}
upnow=$(cut -f1 -d"." /proc/uptime)
upmmt=$(( $(date +%s) - ${upnow} ))
dmesg \
| while read LINE; do
if [ "$(echo ${LINE} | egrep -v "^\[")" == "" ] ; then
timestamp=$(echo "${LINE}" | sed "s/^\[ *\([0-9]\+\).*/\1/g")
timestamp=$(( ${timestamp} + ${upmmt} ))
echo "${LINE}" | sed "s/^[^]]\+]\(.*\)/$(localtime "${timestamp}") -\1/g"
else
echo "${LINE}"
fi
done
Esta es una actualización de la sugerencia de Plutoid, eliminando los espacios iniciales de la marca de tiempo.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/( *)(\d+)\.\d+/localtime($2 + $a)/e; print $_;'
Un pequeño script perl como se muestra a continuación. Es una forma general, y no soy el autor.
dmesg|perl -ne 'BEGIN{$a= time()- qx!cat /proc/uptime!};s/(\d+)\.\d+/localtime($1 + $a)/e; print $_;'
perl -n
es una forma de leer la entrada estándar y leer en la variable $ _.s/...
comando toma el valor en $ _ y sustituye la parte #####. ###### de la marca de tiempo con la versión "localtime" del desplazamiento dmesg ($ 1 ) agregado a la hora de inicio del sistema ($ a). - print $a
imprime el dmesg con la marca de tiempo amigable localmente sustituida por la marca de tiempo "segundos desde el arranque".