Как получить уведомление о падении сайта, используя Bash и Python?

Существует множество способов мониторинга и установки оповещений для веб-сервера с помощью приложений сторонних производителей. Но они не предоставляются бесплатно, будь то Pingdom или Amazon’s CloudWatch. В этой статье вы узнаете, как можно написать и настроить свой собственный инструмент оповещений с помощью всего нескольких строк кода на Python и Bash.
Но давайте сначала посмотрим, какие команды и утилиты доступны в Linux для мониторинга работоспособности веб-сервера.
Есть много команд и утилит, доступных для мониторинга веб-сайта или приложения. Вот некоторые из них:
👉 curl
👉 wget
👉 ping
curl
curl — мощная утилита для отправки и получения данных по многим протоколам, таким как HTTP, FTP, SMTP. Мы будем использовать curl с опциями I для получения заголовков с веб-сайта. Основываясь на заголовке, мы можем определить, работает сервер или нет. Давайте попробуем.
*Команда: * curl -I SERVER IP *
shaikh@ubuntu:~/scripts$ curl -I "https://hashnode.com"
HTTP/2 200
date: Thu, 29 Oct 2020 17:35:18 GMT
content-type: text/html; charset=utf-8
cache-control: public, s-maxage=1800, max-age=0
etag: W/"4436a-AFOlSSR9igz5hRyOL+SdGTPJfxk"
vary: Accept-Encoding
x-frame-options: Deny
x-powered-by: Next.js
cf-cache-status: HIT
age: 1020
cf-request-id: 061706b33c0000051308a22000000001
Как показано выше, curl-I возвращает заголовок, а самая первая строка (HTTP/2 200) говорит нам о том, что веб-сервер для hashnode запущен и работает. Обратите внимание, что он работает до тех пор, пока код отклика 200,301,302,308. В приведенном выше примере код ответа 200, значит, всё хорошо.
wget
Это еще одна утилита в linux, используемая в качестве загрузчика вниз по сети. Мы будем использовать опцию -S для получения заголовков с сайта.
ИСПОЛЬЗОВАНИЕ:
wget -s SERVER : Эта утилита будет получать и скачивать заголовки и страницы веб-сайта.
wget -S —spider SERVER : Она будет работать точно так же, как и выше, за исключением того, что не будет загружать страницы.
shaikh@ubuntu:~/scripts$ wget -S --spider http://shaikhu.com
URL transformed to HTTPS due to an HSTS policy
Spider mode enabled. Check if remote file exists.
--2020-10-29 10:47:55-- https://shaikhu.com/
Resolving shaikhu.com (shaikhu.com)... 192.241.200.144
Connecting to shaikhu.com (shaikhu.com)|192.241.200.144|:443... connected.
HTTP request sent, awaiting response...
HTTP/1.1 302 Found
Alt-Svc: h3-29=":443"; ma=2592000
Content-Length: 206
Content-Type: text/plain; charset=utf-8
Date: Thu, 29 Oct 2020 17:47:55 GMT
Как показано выше, код возврата для перенаправления — 302, значит наш сервер работает.
Ping
Ping является наиболее распространенной утилитой для проверки здоровья веб-сервера. Она посылает ICMP ECHO_REQUEST на сетевой хост для получения информации. Мы будем использовать опцию -C count для отправки n пакетов запросов.
ИСПОЛЬЗОВАНИЕ:
ping -c COUNT SERVER
Вышеприведенная команда не будет посылать СЕРВЕРУ пакетов запросов.
shaikh@ubuntu:~/scripts$ ping -c 3 shaikhu.com
PING hashnode.network (192.241.200.144) 56(84) bytes of data.
64 bytes from 192.241.200.144 (192.241.200.144): icmp_seq=1 ttl=55 time=38.2 ms
64 bytes from 192.241.200.144 (192.241.200.144): icmp_seq=2 ttl=55 time=34.0 ms
64 bytes from 192.241.200.144 (192.241.200.144): icmp_seq=3 ttl=55 time=36.0 ms
--- hashnode.network ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 33.954/36.039/38.178/1.724 ms
shaikh@ubuntu:~/scripts$
Как показано выше, мы отправили 3 пакета, а также получили 3 пакета, что означает, что наш сайт запущен и работает.
Как написать базовый сценарий оболочки?
Теперь, когда мы знаем, какие команды и утилиты использовать, чтобы узнать статус нашего сайта, давайте начнем.
Шаг 1 : Создайте новый файл для скрипта оболочки
Позволяет создать новый файл с именем alert.sh и сохранить его в домашней папке. Мы можем использовать любую из вышеперечисленных команд, чтобы узнать статус веб-сайта. Например, опцию веб паука wget’s для получения подробностей. Но вы можете использовать любую из них.
Перед написанием любого скрипта, обратите внимание на точное местоположение bash.
shaikh@ubuntu:~/scripts$ which bash
/usr/bin/bash
Теперь давайте начнем писать скрипт оболочки alert.sh
#!/usr/bin/bash
MYHOST="https://YOUR WEBSITE ADDRESS"
if wget --spider -S $MYHOST 2>&1 | grep -w "200\|301\|302\|308" > /dev/null
then
echo "server is up"
else
#Server is down"
/usr/bin/python3 send_alert.py
fi
Это очень простой скрипт для мониторинга веб-сервера и отправки уведомления по электронной почте, если тот не работает. Позволяет понять, что вы делали построчно.
В самой первой строке мы указываем место расположения *bash. Это мы сохранили адрес сайта в переменной под названием MYHOST. Из строки под номером 3 мы выполняем команду wget в операторе if else. Если код возврата из wget отличается от 200,301,302 и 308, то управление перейдет к другому блоку. На этом шаге вы можете изменить команду на ping или curl, как вам больше нравится.
В другом блоке мы делаем файл Python под названием send_alert.py для отправки уведомления по электронной почте. Вы можете не делать этот шаг, если посылаете письмо, используя MAILX пакета linux в скрипте оболочки.
Как отправить письмо с помощью Python?
Написать письмо на Python очень просто. Ведь мы можем использовать встроенную библиотеку Python smtplib для отправки электронного письма. Как видно, остальной код довольно прост. Мы определили FROM_EMAIL, пароль, TO_EMAIL, заголовок и, наконец, тело.
Давайте посмотрим, как выглядит наш send_alert.
import smtplib
FROM = 'FROM EMAIL ADDRESS'
PSWD = 'YOUR PASSWORD'
TO = 'TO EMAIL ADDRESS'
#Subject and header
SUB = 'Subject: Alert for shaikhu.com \n'
header = 'To:' + TO + '\n' + 'From: ' + FROM + '\n' + SUB
#Message
body = """
MAY DAY! MAY DAY!! MAY DAY!!!
Your webserver for shaikhu.com is DOWN."""
message = header + body
#Define function to send email
def sendalert(msg):
smtpObj = smtplib.SMTP('smtp.mail.yahoo.com', 587)
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login(FROM, PSWD)
smtpObj.sendmail(FROM,TO,msg)
smtpObj.quit()
if __name__ == '__main__':
sendalert(message)
Поздравляю!!! Вы только что написали собственный скрипт для мониторинга сервера и отправки уведомления по электронной почте, если тот не работает. Теперь все, что нужно сделать — поместить этот скрипт на стол планировщика или cron, так чтобы он запускался каждые n минут, и можете продолжать мониторинг сайта.
Источник: https://dev.to/shaikh/how-to-get-email-alert-when-your-website-is-down-using-shell-and-python-1o62