PDA

View Full Version : [BASH]Monitoring script


w0nz3r
19-07-2012, 14:28
Ciao ragazzi,

ho bisogno di una mano
Avrei bisogno di monitorare alcuni server e farmi inviare mail se uno di questi non risponde al ping.
Necessito però di utilizzare un file (list.txt) che contiene 3 colonne (nome server, ip gataway, ip address) e n righe.

Il file (list.txt) è così composto (esempio):

server1 30.30.30.1 30.30.21.1
server2 30.30.30.2 30.30.21.2
server3 30.30.30.3 30.30.21.3

Il mio bash script (incompleto) è questo:


#!/bin/bash

#Check IP
for i in $(cat list.txt | awk '{ print $2}')
do
#n=$(cat lista | awk '{ print $1}')
ping -c 1 -w 1 $i &> /dev/null
if [ $? -ne 0 ]; then
echo "GW $i DOWN!"
fi
done

Lo script funziona, ma la variabile $i è l'ip del GW, mentre io vorrei che apparisse il nome del server down (colonna 1).

Se rimuovo il commento da #n=$(cat lista | awk '{ print $1}') e inserisco la variabile $n in "echo" (echo "GW $n DOWN!") mi da giustamente come output tutta la lista della colonna 1...
Dovrei poi inserire allo stesso modo il check della colonna 3 e l'alert via mail (check ogni 15 min nel crontab).

Grazie a tutti per l'aiuto!

-w-

GByTe87
19-07-2012, 16:17
Ciclare sulle intere righe del file e separare ip, nome e gateway all'interno del ciclo?

Rapidamente (sicuramente la sintassi va corretta):

for i in $(cat lists.txt)
do
ip = echo $i | awk '{ print $2}'
server = echo $i | awk '{ print $1}'
ping -c 1 -w 1 $ip &> /dev/null

if [ $? -ne 0 ]; then
echo "GW $server DOWN!"
fi
done

w0nz3r
19-07-2012, 17:20
Grazie 1000,

utilizzando la tua idea sono riuscito nel mio intento.
Ho utilizzato però un ciclo while in questo modo:

#Check IP
while read server gw ip; do
if ! ping -c 1 -w 1 $ip &> /dev/null ; then
echo "GW $server ($gw) IS DOWN!"
fi
done < lista.txt

while read server gw ip; do
if ! ping -c 1 -w 1 $ip &> /dev/null ; then
echo "IP $server $gw IS DOWN!"
fi
done < list.txt

Gentilissimo!


Già che ci sono...
Posso utilizzare un solo ciclo while? Se si in che modo?
Inoltre dovrei fare in modo che mandi una mail solo se entrambi gli ip ($ip e $gw) dello stesso host ($server) siano down.
E con questa avrei concluso!

Grazie ancora...