Скрипт Bash для определения, когда мой сервер выключен или отключен


17

Справочная информация: мне нужно получить предупреждение, когда мой сервер не работает. Когда сервер не работает, возможно, сборщик Sysload не сможет отправить любое предупреждение. Чтобы получать оповещения, когда сервер не работает, у меня есть внешний источник (сервер) для его обнаружения.

Вопрос: Есть ли способ (я предпочитаю bash script) определить, когда мой сервер выключен или находится в автономном режиме и отправляет предупреждающее сообщение (электронная почта + SMS)?

Ответы:


24

Если у вас есть отдельный сервер для запуска сценария проверки, то примерно так можно выполнить простой тест Ping, чтобы проверить, работает ли сервер:

#!/bin/bash
SERVERIP=192.168.2.3
NOTIFYEMAIL=test@example.com

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

Вы можете периодически запускать скрипт.

Если у вас нет mailx, вам придется заменить эту строку любой почтовой программой командной строки, которую вы используете, и, возможно, изменить параметры. Если ваш оператор предоставляет адрес электронной почты для SMS, вы можете отправить его на этот адрес. Например, если вы отправите электронное письмо по адресу phonenumber @ txt.att.net, AT & T отправит письмо на ваш телефон.

Вот список сообщений электронной почты для SMS-шлюзов:

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

Если ваш сервер является общедоступным веб-сервером, есть несколько бесплатных сервисов для мониторинга вашего сайта и оповещения о его отключении, поищите в Интернете бесплатный мониторинг сайта, чтобы найти его.


Можете ли вы сделать детали относительно SMS-сообщения?
Г-н Махбубур Рахман

4
Вместо того, чтобы пропинговать сервер, вы должны проверить все, что вы заботитесь о работе сервера. Например, если это почтовый сервер, гораздо важнее, чтобы он успешно отправлял и получал почту.
Джим Пэрис

В своем ответе я держался подальше от обнаружения приложений, поскольку в этом вопросе не было указано, какие службы запущены на сервере, - он попросил обнаружить сервер вверх / вниз. Существуют сотни общих служб, которые можно обнаружить, и неограниченное количество пользовательских приложений. Похоже, у него есть локальный монитор служб (sysload), который отслеживает службы.
Джонни

Пинг для меня практически бесполезен. У меня не работает сервер, но я получаю 3 из 3 возвращенных пакетов и окончательное возвращаемое значение 0. Почему? Локальный компьютер возвращает пакеты «Узел назначения недоступен».
AlastairG

@AlastairG - это лучше задать как вопрос, в комментарии недостаточно места, чтобы ответить на него. Но сначала поищите на сайте, чтобы увидеть, если кто-то задал похожий вопрос, вы можете найти свой ответ там.
Джонни

9

Пинг является опцией, но во многих случаях машина сможет отправлять пинг-ответ, в то время как реальный сервер, на котором она работает, не работает. Лучше сделать сквозной тест. В приведенном ниже примере страница запрашивается с веб-сервера.

Если это веб-сервер, он будет выглядеть примерно так:

#!/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'
}

Если вы измените html-документ на php-документ и сделаете так, чтобы сценарий de php проверял такие вещи, как соединение с базой данных, файловые системы и т. Д., Вы даже можете протестировать больше аспектов сервера. Таким образом, вы можете запустить упреждающий мониторинг компьютера (посмотрите на проблемы, прежде чем они приведут к сбою сервера).

Аналогично проверке почтового сервера, но вместо запроса веб-страницы вы просто отправляете электронное письмо через почтовый сервер и проверяете, получаете ли вы его в своем почтовом ящике.


если вы получили корневые письма, отправленные на ваш почтовый ящик, вам не нужно отправлять почту, если вы выполняете этот скрипт в crontab (потому что он отправит вам стандартный вывод)
pscheit

5

Вот как я решил ту же проблему

#!/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

Я должен был адаптироваться, чтобы работать на моем Mac /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL

Это решение наверняка работает НО. (1) если вы вызываете это на локальной машине, я думаю, это скажет вам, что apache умер, хотя я бы так не поступил. (2) Если вы используете это на локальном компьютере, и сеть не работает или что-то находится между этим ящиком и его пограничным сервером или чем-то еще, вы не получите электронное письмо и не будете знать, что есть проблема. (3) Если вы используете это на другом компьютере, ваша команда curl будет длиться долго, если не указано иное, поэтому, если вы просматриваете несколько хостов, она остановится ..
Mike Q,

1

Я очень рекомендую использовать Nagios , это инфраструктура для мониторинга и оповещения о любом сервисе, который вы хотите (доступно много плагинов, и вы можете написать свой). Конечно, он может выполнять простые эхо-запросы для проверки доступности серверов, но, как отмечали другие, лучше вместо этого проверять доступность сервисов (например, Интернет, электронная почта и т. Д.) (Что nagios может сделать легко).


это крутой продукт, мне интересно о проблемах безопасности
Mike Q
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.