Skrypt Bash, aby wykryć, kiedy mój serwer jest wyłączony lub offline

17

Tło: muszę otrzymać alert, gdy mój serwer nie działa. Gdy serwer nie działa, być może moduł Sysload nie będzie w stanie wysłać żadnego ostrzeżenia. Aby otrzymać alert, gdy serwer jest wyłączony, mam zewnętrzne źródło (serwer), aby go wykryć.

Pytanie: Czy jest jakiś sposób (wolę skrypt bash), aby wykryć, kiedy mój serwer jest wyłączony lub offline i wysyła komunikat ostrzegawczy (e-mail + SMS)?

Md Mahbubur Rahman
źródło

Odpowiedzi:

24

Jeśli masz osobny serwer do uruchamiania skryptu sprawdzania, coś takiego wykonałby prosty test ping, aby sprawdzić, czy serwer żyje:

#!/bin/bash
SERVERIP=192.168.2.3
[email protected]

ping -c 3 $SERVERIP > /dev/null 2>&1
if [ $? -ne 0 ]
then
   # Use your favorite mailer here:
   mailx -s "Server $SERVERIP is down" -t "$NOTIFYEMAIL" < /dev/null 
fi

Możesz skronić skrypt, aby uruchamiał się okresowo.

Jeśli nie masz mailx, musisz zastąpić ten wiersz dowolnym programem pocztowym z linii poleceń i prawdopodobnie zmienić opcje. Jeśli Twój operator podaje adres e-mail SMS, możesz wysłać wiadomość e-mail na ten adres. Na przykład w przypadku AT&T, jeśli wyślesz wiadomość e-mail na numer telefonu @ txt.att.net, wyśle ​​wiadomość e-mail na Twój telefon.

Oto lista bram e-mail do bramek SMS:

http://en.wikipedia.org/wiki/List_of_SMS_gateways

Jeśli Twój serwer jest publicznie dostępnym serwerem internetowym, istnieje kilka bezpłatnych usług monitorowania Twojej witryny i powiadamiania Cię, jeśli nie działa, przeszukaj internet w poszukiwaniu bezpłatnego monitorowania witryny, aby ją znaleźć.

Jasio
źródło
Czy możesz podać szczegółowe informacje dotyczące wiadomości alarmowej SMS?
Md Mahbubur Rahman,
4
Zamiast pingować serwer, powinieneś przetestować cokolwiek obchodzi serwer. Na przykład, jeśli jest to serwer pocztowy, ważniejsze jest, aby pomyślnie wysyłał i odbierał pocztę.
Jim Paris,
W odpowiedzi unikałem wykrywania aplikacji, ponieważ pytanie nie określało, jakie usługi działają na serwerze - poprosił o wykrycie serwera w górę / w dół. Istnieją setki typowych usług, które można wykryć i nieograniczona liczba niestandardowych aplikacji. Wygląda na to, że ma monitor lokalnego serwisu (sysload), który monitoruje usługi.
Johnny
Ping jest dla mnie prawie bezużyteczny. Mam wyłączony serwer, ale dostaję 3 z 3 pakietów i końcowa wartość zwracana wynosi 0. Jak to możliwe? Komputer lokalny zwraca pakiety „Host docelowy nieosiągalny”.
AlastairG,
@AlastairG - lepiej zadać to pytanie, w komentarzu jest za mało miejsca, aby na nie odpowiedzieć. Ale najpierw przeszukaj witrynę, aby sprawdzić, czy ktoś zadał podobne pytanie, tam możesz znaleźć odpowiedź.
Johnny
9

Pingowanie jest opcją, ale w wielu przypadkach komputer będzie mógł wysłać odpowiedź ping, podczas gdy rzeczywisty serwer, o który chodzi, jest wyłączony. Lepiej zrobić test od końca do końca. W poniższym przykładzie strona żądana jest od serwera WWW.

Jeśli jest to serwer WWW, wyglądałby mniej więcej tak:

#!/bin/bash
wget -qO /dev/null 'http://webserver/some_existing_short_document.html' || {
    echo "Webserver down"
    # another mailer example
    sendemail -s mailserverip -f 'from@localhost' -t 'user@localhost' -u 'Webserver down' -m 'The webserver is down'
}

Jeśli zmienisz dokument HTML na dokument php i sprawisz, że skrypt de php przetestuje takie rzeczy, jak połączenie z bazą danych, systemy plików itp., Możesz nawet przetestować więcej aspektów serwera. W ten sposób możesz rozpocząć proaktywne monitorowanie komputera (zobacz problemy, zanim spowodują awarię serwera).

Podobnie jest w przypadku sprawdzania serwera pocztowego, ale zamiast żądania strony internetowej, wystarczy wysłać wiadomość e-mail za pośrednictwem serwera pocztowego i sprawdzić, czy otrzymasz ją w swojej skrzynce pocztowej

jippie
źródło
jeśli otrzymałeś e-maile roota przesłane do twojej skrzynki odbiorczej, nie musisz wysyłać
maila,
5

Oto jak rozwiązałem ten sam problem

#!/bin/bash
NOTIFYEMAIL=<your email>
SMSEMAIL=<cell phone number @ sms-gateway>
SENDEREMAIL=alert@localhost
SERVER=http://127.0.0.1/
PAUSE=60
FAILED=0
DEBUG=0

while true 
do
/usr/bin/curl -sSf $SERVER > /dev/null 2>&1
CS=$?
# For debugging purposes
if [ $DEBUG -eq 1 ]
then
    echo "STATUS = $CS"
    echo "FAILED = $FAILED"
    if [ $CS -ne 0 ]
    then
        echo "$SERVER is down"

    elif [ $CS -eq 0 ]
    then
        echo "$SERVER is up"
    fi
fi

# If the server is down and no alert is sent - alert
if [ $CS -ne 0 ] && [ $FAILED -eq 0 ]
then
    FAILED=1
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER failed"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$SMSEMAIL" 
        echo "$SERVER went down $(date)" | /usr/bin/mailx -s "$SERVER went down" -r "$SENDEREMAIL" "$NOTIFYEMAIL" 
    fi

# If the server is back up and no alert is sent - alert
elif [ $CS -eq 0 ] && [ $FAILED -eq 1 ]
then
    FAILED=0
    if [ $DEBUG -eq 1 ]
    then
        echo "$SERVER is back up"
    fi
    if [ $DEBUG = 0 ]
    then
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$SMSEMAIL"
        echo "$SERVER is back up $(date)" | /usr/bin/mailx -s "$SERVER is back up again" -r "$SENDEREMAIL" "$NOTIFYEMAIL"
    fi
fi
sleep $PAUSE
done
użytkownik54782
źródło
Musiałem przystosować się do działania na moim komputerze Mac /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL,
To rozwiązanie na pewno działa, ALE. (1) jeśli wywołujesz to na lokalnej maszynie, to chyba ci powie, że Apache umarł, chociaż nie zrobiłbym tego w ten sposób. (2) Jeśli użyjesz tego na komputerze lokalnym, a sieć nie działa lub coś między tym urządzeniem a serwerem brzegowym lub coś takiego, nie otrzymasz wiadomości e-mail i nie będzie wiedział, że jest problem. (3) Jeśli użyjesz tego na innym komputerze, twoje polecenie zwijania potrwa DŁUGO, jeśli nie jest to określone, więc jeśli patrzysz na wiele hostów, zatrzyma się.
Mike Q
1

Gorąco polecam korzystanie z Nagios , jest to infrastruktura do monitorowania i powiadamiania o dowolnej usłudze, którą chcesz (dostępnych jest wiele wtyczek i możesz napisać własną). Może oczywiście wykonywać proste pingi, aby sprawdzić dostępność serwerów, ale jak zauważyli inni, lepiej zamiast tego sprawdzić dostępność usług (np. WWW, e-mail itp.) (Które nagios mogą łatwo zrobić).

Emerino
źródło
to fajny produkt, zastanawiam się nad kwestiami bezpieczeństwa
Mike Q