Problema: Se tiene un par de servidores conectados mediante un cable de red de forma directa, se requiere monitorear cualquier cambio del estado del link en cada nic, para asegurar la conectividad de un servicio de balanceo de carga.
Solución: Crear un script, en cada nodo, que monitore el cambio del estado del link y envíe notificación al log común del sistema
Script:
[root@server ~]# cat conn.sh #!/bin/bash NIC=eth0 TIME=$(date +"%b %d %T") HOST=$(hostname -s) LOG=/var/log/messages cat /sys/class/net/$NIC/carrier > /dev/null 2>&1 if [ $? = 0 ]; then echo "$TIME $HOST link[OK]: tengo link en $NIC" >> $LOG else echo "$TIME $HOST link[NOK]: NO tengo link en $NIC" >> $LOG fi [root@server ~]#
Lo ejecutamos para validar que se registre de forma correcta:
[root@server ~]# ./conn.sh [root@server ~]# tail -1 /var/log/messages Feb 23 22:00:29 server link[OK]: tengo link en eth0 [root@server ~]#
Modificamos la variable NIC (eth1) para comprobar que registre correctamente el cambio de estado:
[root@server ~]# ./conn.sh [root@server ~]# tail -1 /var/log/messages Feb 23 22:03:19 server link[NOK]: NO tengo link en eth1 [root@server ~]#
Como únicamente queremos que registre cuando la nic pierde el link, modificamos esta línea:
echo "$TIME $HOST link[OK]: tengo link en $NIC" >> $LOG
Quedando como:
echo "" > /dev/null 2>&1
Al ejecutarlo, si la nic tiene link, no se registrará en el log:
[root@server ~]# ./conn.sh [root@server ~]# tail -1 /var/log/messages Feb 23 22:03:19 server link[NOK]: NO tengo link en eth1 [root@server ~]#
Configuramos cron para que se ejecute el script cada minuto:
* * * * * /root/conn.sh
Espero les sirva…
Interesante el tip, aunque tengo una duda, ¿sabrás si el valor de …$NIC/carrier sólo es válido para conexiones por cable? y bueno ya son dos dudas ¿el agregar los mensajes directamente al /var/log/messages no se corre riesgo con la simultaniedad de escritura de algún otro proceso?
Salu2+ y gracias por compartir!
Pues hice la prueba en mi lap, y bajo ese directorio se encuentran todas las interfaces, incluso las virtuales:
[root@isengard ~]# ls /sys/class/net/
docker0 em1 lo tun0 virbr0 virbr0-nic wlp3s0
[root@isengard ~]#
En todas existe el archivo /carrier, por lo que supongo que podría adaptarse para monitorear cualquer interfaz del sistema.
Por otro lado, el registrarlo en el /var/log/messages ayuda a mantener centralizada la bitácora del sistema, si tuvieramos un servicio de alertas basado en syslog, hasta podría enviarnos un correo electrónico. Es la best-practice de la industria. 😉
Saludos!!
Con lo que has comentado, he realizado una prueba monitoreando wlan0 con el archivo carrier, en algún momento perdí conectividad, hice un ping y no obtuve respuesta, pero carrier tenía valor de 1, lo que me hace pensar que posiblemente para wifi no sea muy conveniente o que mi distro (Linuxmint) tenga algún bug que no actualice de forma correcta el valor de carrier. A seguir investigando! 😉
Salu2+