Jako, że adminuję małą siecią radiową, a nie lubię dowiadywać się o padzie któregoś nadajnika od jej użytkowników, wpadłem na pomysł, żeby do monitorowania i sygnalizacji wykorzystać serwerowy głośniczek, co jest dla mnie optymalnym rozwiązaniem, biorąc pod uwagę, że serwer stoi w zasięgu słuchu. Zresztą, zawsze można sobie głośnik podprowadzić kablem...
Skrypt można w łatwy sposób dostosować do tego, aby wykonywał inną akcję, np. wysyłał maile lub sms-y.
Do działania wymaga zainstalowanego programu fping i beep - do zdobycia w większości dystrybucji :)
Skrypt jaki jest każdy widzi, może komuś się przyda :)
#!/bin/bash # Skrypt do monitorowania dostępności hosta w sieci w oparciu o PING (program fping) i sygnalizowania tego - w tym przypadku przez PC speaker. # Uruchamia się go przez podanie właściwych zmiennych, np. ADRES1="192.168.100.132" INTERVAL_IF_ALIVE="30" DESC="MT2-most5G" BEEP_PARAM="-r 4 -l 10" /etc/livecheck.sh # zmienne: # ADRES1: adres sprawdzanego hosta # ADRES2: adres drugiego sprawdzanego hosta, z powyższym tworza parę - skrypt "zabipa", gdy obydwa hosty nie odpowiedzą na ping # DESC: przyjazny opis, jeśli brak to w logu zostanie zapisany adres ADRES1 # INTERVAL_IF_ALIVE: czas pomiędzy sprawdzeniami, jeśli ostatnie sprawdzenie dało wynik pozytywny # INTERVAL_IF_DEAD: czas pomiędzy sprawdzeniami, jeśli ostatnie sprawdzenie dało wynik negatywny (unreachable) # FPING_PARAM: parametry jakie można przekazać do programu fping, np. można wydłużyć czas sprawdzania poprzez FPING_PARAM="-t 5000" # BEEP_PARAM: parametry jakie można przekazać do programu beep, np. w celu zróznicowania wydawanych dzwięków. # LOG: plik, do którego są logowane "pady" # ścieżka do programów na wszelki wypadek PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin" TAG_SENT_LOG="0" # zmienna do ustalenia czy log został wcześniej zapisany #sekcja sprawdzania zmiennych if [ -x $ADRES1 ] then ADRES1="127.0.0.1" fi if [ -x $ADRES1 ] && [ -x $ADRES2 ] then CASE="single" else CASE="double" fi if [ -x $DESC ] then DESC=$ADRES1 fi if [ -x $LOG ] then LOG="/var/log/livecheck.log" fi if [ -x $INTERVAL_IF_ALIVE ] then INTERVAL_IF_ALIVE="300" fi if [ -x $INTERVAL_IF_DEAD ] then INTERVAL_IF_DEAD="10" fi # sekcja funkcji dead() { if [ $TAG_SENT_LOG -eq 0 ] then DATE="`date +%X\,\ %d\ %b`" echo "host nie odpowiedział - zaznaczono w logu" echo -e "$DATE: DEAD - $DESC" >> $LOG TAG_SENT_LOG="1" fi INTERVAL=$INTERVAL_IF_DEAD beep $BEEP_PARAM return $INTERVAL } alive() { if [ $TAG_SENT_LOG -eq 1 ] then DATE="`date +%X\,\ %d\ %b`" echo "host odpowiedział - zaznaczono w logu" echo -e "$DATE: ALIVE - $DESC" >> $LOG TAG_SENT_LOG="0" fi INTERVAL=$INTERVAL_IF_ALIVE return $INTERVAL } case "$CASE" in single) # sekcja sprawdzania pojedynczego hosta while true # nieskończona pętla do fping $ADRES1 $FPING_PARAM # fping działa w ten sposób, że wysyła ping do hosta; zwraca status wyjścia 0 przy pierwszej pozytywnej odpowiedzi. Jeśli host jest niedostępny, to robi 3 próby i zwraca status wyjścia 1 if [ $? -gt 0 ] # sprawdzenie stanu wyjścia pinga then dead # wywołanie funkcji dead() else alive # wywołanie funkcji alive() fi sleep $INTERVAL done ;; double) # sekcja sprawdzania dwóch hostów; skrypt "zabipa", gdy obydwa hosty nie odpowiedzą na ping while true # nieskończona pętla do fping $ADRES1 $FPING_PARAM ADRES1_STATUS=$? fping $ADRES2 $FPING_PARAM ADRES2_STATUS=$? if [ $ADRES1_STATUS -gt 0 ] && [ $ADRES2_STATUS -gt 0 ] then dead # wywołanie funkcji dead() else alive # wywołanie funkcji alive() fi sleep $INTERVAL done ;; esac
Przykład logów:
serwer ~ # tail -n 4 /var/log/livecheck.log 12:10:04, 18 kwi: DEAD - MT1-most5G 12:12:14, 18 kwi: ALIVE - MT1-most5G 19:57:33, 18 kwi: DEAD - MT2-most5G 20:05:26, 18 kwi: ALIVE - MT2-most5G

Komentarze