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

182

Существует множество способов мониторинга и установки оповещений для веб-сервера с помощью приложений сторонних производителей. Но они не предоставляются бесплатно, будь то 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

Поделитесь в соц.сетях
  • 1
  •  
  •  
  •  
  •  
  •  
  •  

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *