Terminal-icon

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…