PDA

Visualizza la versione completa : script bash per rilevare anomalie nei ping


Sifr
27-07-2007, 13:48
Ciao,
sto cercando di scrivere uno script in bash per 1) pingare un po' di macchine nella mia rete privata (e fino a qui nessun problema) e, 2) qualora qualcuna di queste risultasse down, vorrei che lo scriptino 3) mi avvisasse via email (ho già installato sendmail, anche qui non dovrei avere nessun problema, ho qualche esperienza precedente con qmail, ma più o meno il funzionamento è quello).

La cosa che non capisco come fare è infatti il punto 2)... mettiamo che il ping non "ritorni" o ci metta un tempo spropositamente alto, come me ne accorgo?

moskitoita
27-07-2007, 14:11
Controlli l'output di "ping indirizzo -c 4" e compare "0% packet loss" è tutto ok

Sifr
27-07-2007, 15:52
Originariamente inviato da moskitoita
Controlli l'output di "ping indirizzo -c 4" e compare "0% packet loss" è tutto ok

è proprio qui il problema... cioè che dovessi controllare l'output di ping <indirizzo> non c'erano dubbi, il problema è come :fagiano: :fagiano:

:ciauz:

untamed
27-07-2007, 16:23
Ti consiglio di usare "fping", è un comando pensato apposta per questo tipo di script, molto comodo. Puoi impostare il timeout di attesa di risposta. E per mandare le email ti consiglio l'utility "email", facilissima da configurare, la puoi impostare anche con parametri tuoi di posta.

:ciauz:

Sifr
27-07-2007, 16:35
Grazie, fping è fantastico! :yuppi: :yuppi: (l'altro devo ancora provarlo)

Però ancora c'è una cosa che non capisco (può dipendere dal fatto che non sono molto bravo a programmare in bash): come faccio ad ottenere quei valori? Intendo dire, se stessi programmando in un qualunque linguaggio di programmazione, farei una cosa del tipo:

risultato = ping("nomehost");

e poi saprei che ad esempio la funzione ping ritorna -1 su "host unreachable" e 0 se ha successo...

In bash come posso fare una cosa simile? Cioè il passaggio che manca a me è l'elaborazione (o meglio ancora, la raccolta) dei dati.

:ciauz:

untamed
27-07-2007, 16:42
Io ho fatto così:


/usr/sbin/fping -t3000 -u ${servers[@]} 2>/dev/null > /root/servers_down.txt
num_down=`/bin/cat /root/servers_down.txt|/usr/bin/wc -l`

e poi controllo se $num_down è maggiore o uguale a 0. Probabilmente non è una cosa elegantissima ma funziona.

vortex87
27-07-2007, 16:54
Originariamente inviato da Sifr
Grazie, fping è fantastico! :yuppi: :yuppi: (l'altro devo ancora provarlo)

Però ancora c'è una cosa che non capisco (può dipendere dal fatto che non sono molto bravo a programmare in bash): come faccio ad ottenere quei valori? Intendo dire, se stessi programmando in un qualunque linguaggio di programmazione, farei una cosa del tipo:

risultato = ping("nomehost");

e poi saprei che ad esempio la funzione ping ritorna -1 su "host unreachable" e 0 se ha successo...

In bash come posso fare una cosa simile? Cioè il passaggio che manca a me è l'elaborazione (o meglio ancora, la raccolta) dei dati.

:ciauz:

In bash per raccogliere l'output di un programma si usano o gli apici inversi o $(comando ...)
Quindi


dati=`comando 1 | asdasdas | xyz`

equivale a


dati=$(comando 1 | asdasdas | xyz)

L'unica differenza è che è possibile innestare più $( ), cioè ad esempio è ammissibile (e funziona) una cosa del tipo
$(comando1 -l -a | cmd2 -x $(cmd3 asd) | cmd4)

Sifr
27-07-2007, 17:23
Perfetto! Grazie ad entrambi, a Vortex per il chiarimento e ad untamed per quelle linee (che, ammetto, ho copiato spudoratamente con qualche modifica sui parametri da passare a fping :D :D ).

Solo un'ultima cosa riguardante quel " -u ${servers[@]} 2 ": l'ho sostituito con " -u nomeserver 2 " e funziona egregiamente, dunque visto che -u è un parametro documentato nell'help di fping, ne deduco che ${servers[@]} venga tradotto al volo in una lista di server... Hai dichiarato un array nello script stesso te? Che c'entra quel 2 alla fine?

E giusto per concludere in bellezza, perchè gli fai fare un salto in /dev/null prima di arrivare a server_down.txt?

:ciauz:

untamed
27-07-2007, 17:27
"${servers[@]}" rappresenta tutti gli elementi di un array in cui ho messo i server da verificare.
"2>/dev/null" ridirige gli errori su /dev/null invece che sullo standard output.

Loading