скрипт для автоматической проверки доступности веб-сайта

18

Я - одинокий веб-разработчик со своим собственным Centos VPS, на котором размещены несколько небольших веб-сайтов для моих клиентов. Сегодня я обнаружил, что моя служба httpd остановлена ​​(без видимой причины - но это другой поток). Я перезапустил его, но теперь мне нужно найти способ, чтобы я мог получать уведомления по электронной почте и / или SMS, если это произойдет снова - мне не нравится, когда мой клиент звонит мне, чтобы сказать, что их веб-сайт не работает!

Я знаю, что, возможно, существует много разных возможностей, включая программное обеспечение для мониторинга серверов. Я думаю, что все, что мне действительно нужно, это скрипт, который я могу запустить как задание cron с моего хоста dev (который постоянно работает в моем офисе), который пытается загрузить страницу с моего рабочего сервера, и если она не загружается в течение, скажем, 30 секунд, затем он отправляет мне письмо или SMS. Я довольно мусор в сценариях оболочки, отсюда и этот вопрос.

Любые предложения будут с благодарностью.

Xoundboy
источник
3
Вы смотрели в Нагиос или Пингдом? У них есть эта встроенная функциональность (ну, в Pingdom есть встроенные SMS, в Nagios это требует небольшой настройки, но это возможно)
Smudge
Нет, я сейчас посмотрю, спасибо за совет.
Xoundboy

Ответы:

13

Ну ... Самый простой сценарий, я могу написать:

/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" your@e-mail.address

Добавьте его в cron как:

* * * * * /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null  | grep "Normal operation string" || echo "The site is down" | /usr/bin/mail -v -s "Site is down" your@e-mail.address

Но слишком просто сказать вам, в чем проблема, если она существует.

UPD: теперь этот однострочный текст проверяет определенную строку на странице («Строка нормальной работы»), которая должна появляться только при нормальной работе.

UPD2: простой способ отправить страницу с ошибкой по электронной почте:

/usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | grep "Normal operation string" || /usr/bin/wget "www.example.com" --timeout 30 -O - 2>/dev/null | /usr/bin/mail -v -s "Site is down" your@e-mail.address

Минус в том, что страница перезапрашивается в случае неудачного первого теста. На этот раз запрос может быть успешным, и вы не увидите ошибку. Конечно, можно сохранить выходные данные и отправить их в виде вложения, но это сделает скрипт более сложным.

HUB
источник
Выглядит интересно .... так что если страница не загружается в течение 30 секунд, письмо отправляется правильно? Что делать, если страница загружается, но отображается сообщение об ошибке - как ее можно адаптировать для проверки конкретного выхода?
Xoundboy
Обновил ответ. Но скрипт все равно не отправляет вам ошибку.
HUB
- привет, спасибо за обновление - я изо всех сил пытаюсь заставить это работать на моей машине - я не думаю, что почтовая часть команды делает свое дело должным образом - у меня нет времени для устранения неполадок, но я попытаюсь снова завтра или как можно скорее.
Xoundboy
Ну что ж ... Попробуйте вручную запустить почтовую программу и проверить вывод. Также смотрите "/ var / log / mail" для результатов. Проверьте настройки брандмауэра (должен быть разрешен доступ к удаленному порту 25).
HUB
8

Посмотрите на этот скрипт:

curlутилита командной строки для получения URL Сценарий проверяет код выхода ($? Относится к коду выхода самой последней команды в сценарии оболочки) и, если он отличен от 0, сообщает об ошибке (код выхода 0 обычно относится к успеху). Как упоминалось в ответе HUB, вы также можете просто ||из командной строки запустить вторую команду, если первая не удалась.

Как только вы выяснили статус, вам просто нужно отправить себе письмо. Вот пример, который использует mailкоманду для отправки почты из сценария оболочки, предполагая, что на тестируемом вами ящике установлена ​​SMTP:

Кстати, если вы плохо разбираетесь в сценариях оболочки, не ограничивайте себя сценарием оболочки. Вы можете использовать скрипт ruby, php скрипт, любой скрипт, который может запустить ваш сервер! Просто добавьте #!/path/to/executableстроку в начале скрипта - например:

#!/usr/bin/php

mltsy
источник
Спасибо за ваш вклад - я собираюсь проверить это решение, как только у меня будет время. Скоро сообщу.
Xoundboy
6

Проверьте этот скрипт . он проверяет список веб-сайтов и отправляет электронную почту (в список электронных писем) всякий раз, когда что-то не так (HTTP-ответ отличается от 200). Сценарий создает файл .temp, чтобы «запомнить», какой веб-сайт (-ы) не удалось выполнить при последней проверке, чтобы вы не получили несколько электронных писем. файл .temp удаляется, когда веб-сайт снова работает.

#!/bin/bash
# list of websites. each website in new line. leave an empty line in the end.
LISTFILE=/scripts/isOnline/websites.lst
# Send mail in case of failure to. leave an empty line in the end.
EMAILLISTFILE=/scripts/isOnline/emails.lst

# `Quiet` is true when in crontab; show output when it's run manually from shell.
# Set THIS_IS_CRON=1 in the beginning of your crontab -e.
# else you will get the output to your email every time
if [ -n "$THIS_IS_CRON" ]; then QUIET=true; else QUIET=false; fi

function test {
  response=$(curl --write-out %{http_code} --silent --output /dev/null $1)
  filename=$( echo $1 | cut -f1 -d"/" )
  if [ "$QUIET" = false ] ; then echo -n "$p "; fi

  if [ $response -eq 200 ] ; then
    # website working
    if [ "$QUIET" = false ] ; then
      echo -n "$response "; echo -e "\e[32m[ok]\e[0m"
    fi
    # remove .temp file if exist.
    if [ -f cache/$filename ]; then rm -f cache/$filename; fi
  else
    # website down
    if [ "$QUIET" = false ] ; then echo -n "$response "; echo -e "\e[31m[DOWN]\e[0m"; fi
    if [ ! -f cache/$filename ]; then
        while read e; do
            # using mailx command
            echo "$p WEBSITE DOWN" | mailx -s "$1 WEBSITE DOWN" $e
            # using mail command
            #mail -s "$p WEBSITE DOWN" "$EMAIL"
        done < $EMAILLISTFILE
        echo > cache/$filename
    fi
  fi
}

# main loop
while read p; do
  test $p
done < $LISTFILE

Добавьте следующие строки в конфигурацию crontab ($ crontab -e)

THIS_IS_CRON=1
*/30 * * * * /path/to/isOnline/checker.sh

Доступно на Github

ET-CS
источник
2

Я знаю, что все вышеперечисленные скрипты именно то, что вы просили, но я бы посоветовал посмотреть на monit, потому что он отправит вам электронное письмо, если apache не работает, но также перезапустит его (если он не работает).

Jure1873
источник
Это также выглядит интересно - я постараюсь найти время, чтобы проверить это в ближайшее время и изложить свои выводы.
Xoundboy
1

Я бы порекомендовал Pingdom для этого. Их бесплатный сервис позволяет проверить 1 сайт, но это все, что вам нужно, чтобы проверить 1 сервер. Если у вас есть iPhone, они бесплатно отправляют вам сообщения, поэтому вам не нужно покупать смс-кредиты, и у них есть несколько настроек, которые вы можете использовать. Мой установлен, чтобы уведомить меня после 2 повторных попыток (10 минут) и каждые 10 минут простоя после этого. Это потрясающе, так как он также проверяет сообщения HTTP 500, указывающие, что сайт не работает. Если это не удается, он сразу же проверяет ваш сайт снова с другого сервера в другом месте. Если это не удастся, это вызывает ваши предпочтения в том, как / когда вы хотите получать уведомления.

AcidRaZor
источник
Мне очень нравится эта услуга Pingdom - просто создайте бесплатную учетную запись и протестируйте чек и SMS на мой чешский номер мобильного телефона - оба работают - пока опробую и посмотрим, как это будет.
Xoundboy
К сожалению, Pingdom больше не предлагает уровень Free. Наименее дорогой план - $ 14,95 / месяц.
Бен Джонсон
Вы можете использовать cronitor.io - они предлагают один бесплатный сайт для проверки и могут отправлять уведомления на электронную почту, вялый или любой другой веб-крючок.
Риз
Другой альтернативой pingdom был бы uptimerobot , 5-минутные интервалы мониторинга и 50 отслеживаемых веб-сайтов в бесплатном плане. Он также легко интегрируется с Slack и Telegram (кроме push, SMS или уведомлений по электронной почте, ...).
тролологуй
1

Небольшое изменение вышеперечисленного.

Скрипт для проверки доступности сайта каждые 10 секунд. Записывать неудачные попытки в siteuptime.txtфайл, чтобы его можно было просмотреть (или отобразить в Excel) позже.

#!/bin/bash
# Check site every 10 seconds, log failed connection attempts in siteuptime.txt
while true; do
echo "Checking site...";
/usr/bin/wget "http://www.mysite" --timeout 6 -O - 2>/dev/null | grep "My String On page" || echo "The site is down" | date --iso-8601=seconds >> siteuptime.txt;
sleep 10;
done;
dtbaker
источник
1
#!/bin/bash

################Files to be created before starting exicution####################
# sudo apt-get install alsa alsa-utils                                                  #
# mkdir -p $HOME/scripts                                                                    #
# touch $HOME/scripts/URL_File                                                              #
# touch $HOME/scripts/alert_Data                                                            #
# touch /tmp/http                                                                               #
# touch /tmp/http_file                                                                        #
# Download alert.wav file and copy it into $HOME/scripts directory                #
#################################################################################

####### checking existing process and creating temp files for URLs###############
Proc=$(ps -ef | grep http_alerts.sh | wc -l)
number=$(ps -ef | grep http_alerts.sh)
if [ $Proc -gt 3 ]
then
    echo "Script Already Running. Please kill PID($number) and restart"
else
FILE="$HOME/scripts/URL_File"
myfileval=1
while read -r line_read; do
    echo $line_read > /tmp/http_file
    File_name=$(cat /tmp/http_file | awk -v "val=$myfileval" 'NR==val {print $2}')
    File_name_val=$(ls /tmp/$File_name 2>/dev/null | wc -l)
    File_name_val0=0
    if [ $File_name_val -eq $File_name_val0 ]
    then 
        touch /tmp/$File_name
    fi
done < "$FILE"
####### checking existing process and finding temp files for URLs###############
echo "############ SCRIPT STARTED WORKING ################"
echo "############ SCRIPT STARTED WORKING ################" >> $HOME/scripts/alert_Data
echo " " >> $HOME/scripts/alert_Data
####### Continues Loop to check the URLs without break           ###############
while true
do
#######  Reading file URLs                                       ###############
### URL formate- http or https URL; 
### remarks; if domain name 0 else 1; 
### domain without proto(http/https); 
### Public_1; Public_2; ########
filename="$HOME/scripts/URL_File" ### file path
while read -r line; do
        echo $line > /tmp/http ### inserting each line data to temparary file
### Checking Internet Connection #######
        while true
        do
            if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; 
        then   
            break
        else 
            echo "You are not connected to internet. Please wait"
            sleep 5  
        fi
        done 
### Checking Internet Connection #######
    myval=1
    i=$((i+1))
    j=7
    k=$(shuf -i 1-${j} -n 1)
    l=30
    i=$(($l+$k)) ##### Color code 31 to 37
    echo ""
    echo ""
    URL=$(cat /tmp/http |  awk -v "val=$myval" 'NR==val {print $1}')  ### 1st paramater from file. example: http://myabcd.com
    Server_State=$(cat /tmp/http |  awk -v "val=$myval" 'NR==val {print $2}') ### 2nd paramater from file. example: this_is_myabcd_site
    val3=$(cat /tmp/http | awk -v "val=$myfileval" 'NR==val {print $3}') ### 3rd paramater from file. 0 or 1
    val4=$(cat /tmp/http | awk -v "val=$myfileval" 'NR==val {print $4}') ### 4rd paramater from file. example: myabcd.com
    val5=$(cat /tmp/http | awk -v "val=$myfileval" 'NR==val {print $5}') ### 5th paramater from file. example: 123.123.123.111
    val6=$(cat /tmp/http | awk -v "val=$myfileval" 'NR==val {print $5}') ### 6th paramater from file. example: 123.123.123.222
echo "\e[1;${i}m-------------------------------------------------------------------\e[0m"
echo "\e[1;${i}m| Cheking URL :   $URL                             \e[0m"
echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
echo "\e[1;${i}m| Cheking URL :   $URL                             \e[0m" >> $HOME/scripts/alert_Data
DATA=$(date) ### time stamp 
code=$(curl -s -o /dev/null -w "%{http_code}" $URL) ### getting URL response code
if [ $code -eq 200 -o $code -eq 301 -o $code -eq 302 ] ### checking with sucessful response codes
then 
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m"
    echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m"
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m"
    echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" 
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" 
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
elif [ $code -eq 404 -o $code -eq 500 ] ### checking with error response codes
then 
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m"
    echo "\e[1;${i}m| URL IS DOWN :   $URL                             \e[0m"
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m"
    echo "\e[1;${i}m| DOWN TIME   :   $DATA                            \e[0m"
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m"
    echo "\e[1;${i}m| HTTP TIME   :   $code                            \e[0m"
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m"
    echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m"
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m| URL IS DOWN :   $URL                             \e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m| DOWN TIME   :   $DATA                            \e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m| HTTP CODE   :   $code                            \e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" >> $HOME/scripts/alert_Data
    echo "\e[1;${i}m-------------------------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
    aplay $HOME/scripts/alert.wav 2> /dev/null ### On failure buzzer will sound
    /usr/bin/truncate -s 0 /tmp/$Server_State  ### truncate the file with server failure count data
    echo " Dear Admin Team \n The $URL is DOWN for the State $Server_State. The HTTP response code is $code " | mail -s "$Server_State is down" -a "From: from@mail.com" yourmail1@mail.com,yourmail2@mail.com >> /dev/null   ### On failure sending mail
elif [ $code -eq 000 ]
then
   LNUM=$(cat /tmp/$Server_State | wc -l)
   LNUM0=0
   oval=0
    if [ $val3 -eq $oval ] ### checking Domain or Public IP
    then
    dname=$(nslookup $val4 | awk '/^Address: /{print $2}') ### getting domain name Public IPs
        for dname_i in $dname
        do
            dname_url="http://$dname_i/" ### Making Public IP as http URL
            dname_code=$(curl -s -o /dev/null -w "%{http_code}" $dname_url)  ### getting public IP response
            if [ $dname_code -eq 200 -o $dname_code -eq 301 -o $dname_code -eq 302 ]  ### If success response
            then
            echo "\e[1;${i}m---------------------------------------------------\e[0m"
            echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m"
            echo "\e[1;${i}m---------------------------------------------------\e[0m"
            echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" 
            echo "\e[1;${i}m---------------------------------------------------\e[0m" 
            echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
            echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m" >> $HOME/scripts/alert_Data
            echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
            echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" >> $HOME/scripts/alert_Data
            echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
            else #### if did not success response 
                    if [ $LNUM -eq $LNUM0 ] ### If no failure count, then add the failure count from 1
                        then
                        echo "$Server_State 0" > /tmp/$Server_State
                        else 
                        ALT=$(cat /tmp/$Server_State |  awk -v "val=$myval" 'NR==val {print $2}')  ### server failure count
                        ALT5=5
                        if [ $ALT -eq $ALT5 ] ### If failure count is 5 then alert with sound and send mail
                        then
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| URL IS DOWN :   $URL                             \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| DOWN TIME   :   $DATA                            \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| HTTP CODE   :   $code                            \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| Server State:   $Server_State                    \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| URL IS DOWN :   $URL                             \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| DOWN TIME   :   $DATA                            \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| HTTP CODE   :   $code                            \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| Server State:   $Server_State                    \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        aplay $HOME/scripts/alert.wav 2> /dev/null  ### On failure buzzer will sound
                        /usr/bin/truncate -s 0 /tmp/$Server_State   ### truncate the file with server failure count data
                        echo " Dear Admin Team \n The $URL is DOWN for the State $Server_State. The HTTP response code is $code " | mail -s "$Server_State is down" -a "From: from@mail.com" yourmail1@mail.com,yourmail2@mail.com >> /dev/null   ### On failure sending mail 
                        else
                        ALT=$((ALT+1)) ### increase server failure count
                        echo "$Server_State $ALT" > /tmp/$Server_State
                        fi
                        fi
                    fi
                    done
                    oval1=1
                    elif [ $val3 -eq $oval1 ]   ### No domain name backup public IPs are there
                    then
                        if [ "$val5" != "" ]  ### first Public IP of diffrent ISP
                        then 
                        dname_url="http://$val5/" ### making URL with public IP
                        dname_code=$(curl -s -o /dev/null -w "%{http_code}" $dname_url)   ### getting response code
                        if [ $dname_code -eq 200 -o $dname_code -eq 301 -o $dname_code -eq 302 ] ### validating response code
                        then
                        echo "\e[1;${i}m---------------------------------------------------\e[0m"
                        echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m"
                        echo "\e[1;${i}m---------------------------------------------------\e[0m"
                        echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" 
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" 
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        elif [ "$val6" != "" ]  ### second Public IP of diffrent ISP
                        then 
                        dname_url="http://$val6/" ### making URL with public IP
                        dname_code=$(curl -s -o /dev/null -w "%{http_code}" $dname_url)   ### getting response code
                        if [ $dname_code -eq 200 -o $dname_code -eq 301 -o $dname_code -eq 302 ] ### validating response code
                        then
                        echo "\e[1;${i}m---------------------------------------------------\e[0m"
                        echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m"
                        echo "\e[1;${i}m---------------------------------------------------\e[0m"
                        echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" 
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" 
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m| UP TIME     :   $DATA                            \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m| Server State:   $Server_State                    \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[1;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        else
                        if [ $LNUM -eq $LNUM0 ]
                        then
                        echo "$Server_State 0" > /tmp/$Server_State
                        else
                        ALT=$(cat /tmp/$Server_State |  awk -v "val=$myval" 'NR==val {print $2}')  ### server failure count
                        ALT5=5
                        if [ $ALT -eq $ALT5 ]
                        then
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| URL IS DOWN :   $URL                             \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| DOWN TIME   :   $DATA                            \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| HTTP CODE   :   $code                            \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m"
                        echo "\e[0;${i}m| Server State:   $Server_State                    \e[0m"
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| URL IS DOWN :   $URL                             \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| DOWN TIME   :   $DATA                            \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| HTTP CODE   :   $code                            \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m| Server State:   $Server_State                    \e[0m" >> $HOME/scripts/alert_Data
                        echo "\e[0;${i}m---------------------------------------------------\e[0m" >> $HOME/scripts/alert_Data
                        aplay $HOME/scripts/alert.wav 2> /dev/null
                        /usr/bin/truncate -s 0 /tmp/$Server_State
                        echo " Dear Admin Team \n The $URL is DOWN for the State $Server_State. The HTTP response code is $code " | mail -s "$Server_State is down" -a "From: from@mail.com" yourmail1@mail.com,yourmail2@mail.com >> /dev/null   ### On failure sending mail
                        else
                        ALT=$((ALT+1))
                        echo "$Server_State $ALT" > /tmp/$Server_State
                        fi
                    fi
                fi
            fi
        fi
    fi
fi
sleep 4
vl=1
pdate=$(ls -l $HOME/scripts/alert_Data | awk -v "val=$vl" 'NR==val {print $7}')   ### getting file created day
ddate=$(date | awk -v "val=$vl" 'NR==val {print $3}') ### current day count
if [ $pdate -gt $ddate ]  ### validating file created day and current
then 
d=`date +%m-%d-%Y`
mv $HOME/scripts/alert_Data $HOME/scripts/alert_Data$d  ### taking backup of existing file with time stamp
touch $HOME/scripts/alert_Data ### creating new file
fi
done < "$filename"
done
fi
#######################################################################################################################################################
#The content of $HOME/scripts/URL_File is as below
#Please remove "#" and Headline titles. Each parameter will be read by the difrence of spaces.
#URLoftheSite           Remarks         Domain(0)/IPstatus(1)   Domain_name(without protocol)   PublicIP_1      PublicIP_2  
#http://myexamplesite.com   this_is_myexamplesite   1           myexamplesite.com       123.123.123.111     123.123.123.222
шахид шайк
источник
0

Поскольку у вас много сайтов на вашем VPS, я бы порекомендовал вам открыть учетную запись на сайте мониторинга сайтов, например host-tracker.com. Помимо оповещения о том, что сайт не работает, они также предоставляют вам еженедельное, ежемесячное и ежегодное время работы ваших сайтов. Whish очень полезен для управления и производительности.

Alok
источник
0

Как насчет этого:

#!/bin/bash
/etc/init.d/httpd status
if [[ $? == 3 ]]; then
   echo "Httpd is down `date`" | mail support@example.com
   exit 1
fi
exit 0
frogstarr78
источник
1
Мне нравится простота, но это не будет проверять, если веб-сайт доступен через Интернет. Служба может быть запущена, но не обслуживать клиентов. Я влюбился в это раньше.
Джон Гарденье
2
Согласитесь, хотя, если вы хотите убедиться, что он доступен из Интернета, вам придется проверить его через Интернет. Даже запуск wget на сервере с внешним сетевым интерфейсом не был бы точным тестом, чтобы Интернет мог получить к нему доступ.
frogstarr78