Сценарій Bash, щоб виявити, коли мій сервер не працює або в режимі офлайн


17

Передумови: мені потрібно отримувати сповіщення, коли мій сервер не працює. Коли сервер не працює, можливо, колектор Sysload не зможе надіслати повідомлення. Щоб отримувати сповіщення, коли сервер не працює, у мене є зовнішнє джерело (сервер) для його виявлення.

Питання: Чи є спосіб (я вважаю за краще скрипт bash) виявити, коли мій сервер не працює або в автономному режимі, і надсилає повідомлення попередження (електронна пошта + 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, ви можете надіслати електронну пошту на цю адресу. Наприклад, із AT&T, якщо ви надішлите електронний лист на телефонний номер @ txt.att.net, він надішле електронний лист на ваш телефон.

Ось список електронних листів до шлюзів SMS:

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

Якщо ваш сервер є загальнодоступним веб-сервером, є кілька безкоштовних сервісів для моніторингу вашого веб-сайту та попередження про його відсутність, пошукайте в Інтернеті безкоштовний моніторинг веб-сайтів, щоб знайти його.


Чи можете ви детально розповісти про SMS-повідомлення?
Пані Махбубур Рахман

4
Замість того, щоб пінг-сервер, ви повинні перевірити те, що вам важливо робити на сервері. Наприклад, якщо це поштовий сервер, набагато важливіше, щоб він успішно надсилав та отримував пошту.
Джим Парис

У своїй відповіді я тримався осторонь виявлення додатків, оскільки в питанні не було вказано, які служби працюють на сервері - він попросив виявити сервер вгору / вниз. Є сотні загальних служб, які можна було виявити, і необмежена кількість користувацьких додатків. Схоже, у нього є локальний монітор обслуговування (sysload), який здійснює моніторинг служб.
Джонні

Пінг для мене майже не марний. У мене не працює сервер, але я отримую 3 з 3 повернених пакетів і кінцеве значення повернення 0. Як це зробити? Місцева машина повертає пакети "Хост призначення недоступними".
AlastairG

@AlastairG - це було б краще задати як запитання, у коментарі не вистачає місця для відповіді. Але спочатку пошукайте на сайті, щоб дізнатися, чи хтось задав подібне запитання, ви можете знайти там свою відповідь.
Джонні

9

Pinging - це варіант, але в багатьох випадках машина зможе надіслати відповідь ping, тоді як фактичний сервер, про який йдеться, знижується. Краще зробити тест наскрізь. У наведеному нижче прикладі запитується сторінка від веб-сервера.

Якщо це веб-сервер, це виглядатиме приблизно так:

#!/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 (тому що він надішле вам stdout)
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

Мені довелося пристосуватися для роботи на моєму комп'ютері /usr/bin/mail -s "$SERVER went down" "$SENDEREMAIL" "$SMSEMAIL" .
MikeiLL

Це рішення, безумовно, працює, АЛЕ (1) якщо ви називаєте це на локальній машині, я думаю, це скаже вам, що апач загинув, хоча я б не робив це так. (2) Якщо ви користуєтесь цим на локальній машині, і якщо мережа знаходиться вниз або щось середнє між цим полем і його крайовим сервером, або щось таке, ви не отримаєте електронну пошту і, якщо вона не знатиме, що існує проблема. (3) Якщо ви використовуєте це на іншій машині, ваша команда curl потребуватиме довгого часу, якщо не зазначено, тож якщо ви дивилися на багатозвучних хостів, то вона перестане зупинятися ..
Майк Q

1

Я настійно рекомендую використовувати Nagios , це інфраструктура для моніторингу та оповіщення про будь-яку службу, яку ви хочете (багато плагінів, і ви можете написати свій власний). Звичайно, можна зробити прості пінгси, щоб перевірити наявність серверів, але, як вказували інші, краще перевірити наявність послуг (наприклад, веб, електронну пошту тощо) (що нагіоси можна зробити легко).


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