Aquest és un petit projecte que he creat per gestionar un problema recurrent que tenim amb un servidor Proxmox. De tant en tant, el servidor perd connexió a la xarxa i, per no haver d'anar físicament a reiniciar la màquina, he escrit aquest script que fa el treball per mi.
El script network_watchdog.sh
executa un ping cada 60 segons a una IP específica de la xarxa. Si falla tres vegades seguides (és a dir, si no rep respostes de ping durant tres minuts consecutius), assumeix que hi ha un problema de xarxa. En aquest cas, apaga totes les màquines virtuals de manera segura i reinicia el servidor Proxmox.
#!/bin/bash
# Comptador de pings fallits
failed_pings=0
while true; do
# Fer ping a l'adreça IP
ping -c 1 192.168.1.2 > /dev/null
# Comprovar si el ping va fallar
if [ $? -ne 0 ]; then
((failed_pings++))
echo "Ping fallit. Comptador: $failed_pings"
else
failed_pings=0
echo "Ping exitós."
fi
# Comprovar si hi ha tres pings fallits consecutius
if [ $failed_pings -eq 3 ]; then
echo "Tres pings fallits consecutius. Apagant les màquines virtuals i reiniciant el servidor Proxmox..."
# Apagar totes les màquines virtuals
qm list | awk '{print $1}' | xargs -I {} qm shutdown {}
# Esperar que les màquines es tanquin
sleep 60
# Reiniciar el servidor Proxmox
reboot
fi
# Esperar 60 segons abans de fer el següent ping
sleep 60
done
Recorda canviar la IP de la linia 8 a la ip objectiu a la que vulguis apuntar.
El script està configurat per ser executat com un servei de systemd. Això vol dir que s'inicia automàticament quan el sistema s'aixeca i continua corrent en segon pla.
He creat un fitxer de servei systemd anomenat network_monitor.service
que s'encarrega d'executar el script com a servei. Aquí tens el contingut del fitxer:
[Unit]
Description=Network Monitor Service
After=network.target
[Service]
Type=simple
ExecStart=/root/network_watchdog.sh
[Install]
WantedBy=multi-user.target
Després de posar el script al seu lloc i crear el fitxer de servei, simplement s'ha d'habilitar i iniciar el servei amb les següents comandes:
sudo systemctl enable network_monitor.service
sudo systemctl start network_monitor.service
Si per alguna raó necessites aturar el servei (per exemple, si s'està reiniciant el servidor i no vols que segueixi reiniciant-se mentre investigues el problema) pots fer servir aquesta comanda:
sudo systemctl stop network_monitor.service
Però si et fa mandra haver de recordar la comanda o haver d'escriure amb pressa mentre el host està a punt de reiniciar-se pots configurar un alias com aquest:
alias prou='systemctl stop network_monitor.service'
i així al loguejar tant en local com per ssh només cal executar sudo prou i ja pararia el servei (o simplement dir prou si ets root però tots sabem que mai es treballa des de root oi que si?)
Aquest codi s'ofereix tal com és i no es garanteix que funcioni correctament en totes les condicions. No em faig responsable dels danys que puguin resultar de l'ús d'aquesta informació. Utilitzeu-lo sota la vostra pròpia responsabilitat. Si teniu dubtes pregunteu i respondré al que pugui. Si voleu obrir proposar canvis podeu obrir fork i i voleu seguir-me, al panel del principi d'aquest readme podeu trobar links a les meves xarxes socials, Twitch i PayPal per si també voleu donar suport al meu treball.