Monitorizar la temperatura de la placa base, CPU y el disco duro con Monit | Algo de Linux

jueves, 15 de mayo de 2014

Monitorizar la temperatura de la placa base, CPU y el disco duro con Monit

Una vez que tenía monitorizados los servicios de los servidores LTSP, el servidor ldap y el servidor nfs, me pareció que sería interesante monitorizar también la temperatura de la placa base, la cpu y el disco duro de los mismos, y, si fuera posible, las revoluciones de los ventiladores, sobre todo teniendo en cuenta que los servidores de terminales se encuentran en cajones cerrados donde la ventilación puede no ser tan buena como debería.

Como quería utilizar Monit y la versión de los repositorios no admitía programas definidos por el usuario, tuve que crear el paquete para Debian con la versión 5.8.

Para realizar la monitorización, instalé la versión 5.8 de Monit y me basé en lm-sensors y hddtemp:
# apt-get install monit lm-sensors hddtemp
Es importante destacar que instalé monit con apt-get porque lo tenía añadido al repositorio particular que tengo montado en mi centro. Si no lo tenéis añadido a un repositorio propio, tendréis que descargarlo e instalarlo mediante dpkg.

Una vez instalado  el paquete lm-sensors, ya podéis monitorizar voltajes, temperaturas y revoluciones de ventiladores con el comando:
# sensors
Los resultados que obtengáis dependerán de la placa base que tengáis. Os muestro un ejemplo de salida del comando:
# sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +40.0°C  (crit = +75.0°C)

atk0110-acpi-0
Adapter: ACPI interface
Vcore Voltage:      +1.34 V  (min =  +0.85 V, max =  +1.60 V)
 +3.3 Voltage:      +3.31 V  (min =  +3.00 V, max =  +3.60 V)
 +5.0 Voltage:      +4.92 V  (min =  +4.50 V, max =  +5.50 V)
+12.0 Voltage:     +12.16 V  (min = +11.20 V, max = +13.20 V)
CPU FAN Speed:     3229 RPM  (min =    0 RPM, max = 1800 RPM)
CHASSIS FAN Speed: 1493 RPM  (min =    0 RPM, max = 1800 RPM)
POWER FAN Speed:      0 RPM  (min =    0 RPM, max = 1800 RPM)
CPU Temperature:    +31.0°C  (high = +90.0°C, crit = +125.0°C)
MB Temperature:     +38.0°C  (high = +45.0°C, crit = +90.0°C)

k8temp-pci-00c3
Adapter: PCI adapter
Core0 Temp:   +28.0°C  
Core0 Temp:   +23.0°C  
Core1 Temp:   +32.0°C  
Core1 Temp:   +31.0°C  
Del mismo modo, una vez instalado el paquete hddtemp, podréis monitorizar la temperatura del disco duro:
# hddtemp /dev/sda
Un ejemplo:
# hddtemp /dev/sda
/dev/sda: ST32000542AS: 34°C
Bien, pues una vez que tenemos las herramientas necesarias instaladas, creamos un script que obtenga solamente los valores numéricos que necesito. Por ejemplo, yo creé un script /usr/local/sbin/mbtemp.sh que obtiene el valor de temperatura de la placa base y lo devuelve:
# cat /usr/local/sbin/mbtemp.sh 
#!/bin/bash
MBTEMP=`sensors |grep "MB Temperature"| cut -f6 -d" " | tr -d '+' | tr -d '°C'  | awk '{printf("%d\n",$1 + 0.5)}'`
# echo $MBTEMP # for debug only
exit $MBTEMP
Es necesario devolver el valor (exit $MBTEMP) para poder recogerlo en la configuración de Monit y actuar en consecuencia. Una vez que ya tenía el script, creé un fichero de configuración para almacenar las configuraciones de gestión de temperatura en el directorio /etc/monit.d/ con el siguiente contenido:
check program MBtemp with path "/usr/local/sbin/mbtemp.sh"
   if status > 60 then alert
   group temperature
La configuración anterior es muy sencilla. Le estamos diciendo a Monit que utilice el programa MBtemp ubicado en /usr/local/sbin/mbtemp.sh (el nombre MBtemp es identificativo nada más) y si el valor devuelto por el script (la temperatura) es mayor de 60, envíe una alerta.
Bien, pues para monitorizar la temperatura de la CPU, hacemos lo mismo: Creamos un script que obtenga el valor de temperatura de la CPU y lo devuelva:
# cat /usr/local/sbin/cputemp.sh 
#!/bin/bash
CPUTEMP=`sensors |grep "CPU Temperature"| cut -f5 -d" " | tr -d '+' | tr -d '°C'  | awk '{printf("%d\n",$1 + 0.5)}'`
# echo $CPUTEMP # for debug only
exit $CPUTEMP
Y añadimos la configuración de gestión de la temperatura al fichero de gestión de Monit que creamos en el caso anterior:
check program CPUtemp with path "/usr/local/sbin/cputemp.sh"
   if status > 60 then alert
   group temperature
Podríamos almacenar esta configuración en otro fichero nuevo si queremos, pero lo he almacenado en el mismo porque me ha parecido bien organizarlo así. Del mismo modo, creamos un script que obtenga el valor de temperatura del disco duro:
# cat /usr/local/sbin/hddtempsda.sh 
#!/bin/bash
HDDTEMPsda=`hddtemp /dev/sda | cut -f3 -d":" | tr -d ' ' | tr -d '°C'`
# echo $HDDTEMPsda # for debug only
exit $HDDTEMPsda
Y añadimos la configuración de gestión de la temperatura al fichero de gestión de Monit que creamos al principio:
check program HDDtempsda with path "/usr/local/sbin/hddtempsda.sh"
   if status > 50 then alert
   group temperature

Resumiendo. Hemos creado 4 ficheros:
  • /usr/local/sbin/mbtemp.sh (script que obtiene la temperatura de la placa base)
  • /usr/local/sbin/cputemp.sh (script que obtiene la temperatura de la cpu)
  • /usr/local/sbin/hddtemp.sh (script que obtiene la temperatura del disco duro)
  • /etc/monit.d/temperatura (fichero en el que hemos definido las reglas de gestión de temperatura)
El fichero /etc/monit.d/temperatura quedaría así:
check program MBtemp with path "/usr/local/sbin/mbtemp.sh"
   if status > 60 then alert
   group temperature

check program CPUtemp with path "/usr/local/sbin/cputemp.sh"
   if status > 60 then alert
   group temperature

check program HDDtempsda with path "/usr/local/sbin/hddtempsda.sh"
   if status > 50 then alert
   group temperature

Por último, reiniciamos el servicio monit:
# service monit restart

Si ahora abrimos el navegador y accedemos al interfaz web de monit, veremos que se muestra el control de las temperaturas.

Es importante controlar también las revoluciones de los ventiladores para saber si alguno ha bajado de revoluciones o ha dejado de funcionar y evitar que los servidores se calienten.

En los servidores de terminales que tenemos en mi centro es posible monitorizar las revoluciones del ventilador de la cpu y el que está conectado a la conexión CHASSIS FAN SPEED de la placa. No es posible monitorizar el ventilador de la caja porque está conectado directamente a la fuente. Lo peor es que después de revisar todos los servidores de terminales he visto que 12 de ellos tenían el ventilador de la caja gripado. Si hubieran estado conectados a la placa base, podría haberlos monitorizado de forma remota.

Publicado por primera vez en http://enavas.blogspot.com.es