私は自分のCentos VPSを使用して、クライアント向けにいくつかの小さなWebサイトをホストしている唯一のWeb開発者です。今日、httpdサービスが停止したことを発見しました(明確な理由はありませんが、それは別のスレッドです)。再起動しましたが、メールやSMSが再度発生した場合に通知する方法を見つける必要があります。クライアントから電話がかかってきて通知されたときに気に入らない彼らのウェブサイトは動かない!
サーバー監視ソフトウェアなど、さまざまな可能性があると思います。私が本当に必要なのは、開発サーバー(オフィスで永続的に実行されています)からcronジョブとして実行できるスクリプトだけで、運用サーバーからページを読み込もうとし、それが30以内に読み込まれない場合は秒、それは私にメールまたはSMSを送信します。シェルスクリプトではかなりごみが多いので、この質問をします。
任意の提案をいただければ幸いです。
ええと...最も単純なスクリプトです。
/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" [email protected]
次のように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" [email protected]
しかし、それが存在する場合、何が問題なのかを伝えるのは簡単すぎます。
PD:これで、このワンライナーは、ページ上の特定の文字列(「通常の操作文字列」)をチェックします。これは、通常の操作でのみ表示されます。
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" [email protected]
マイナスは、最初のテストが失敗した場合にページが再要求されることです。今回はリクエストが成功する可能性があり、エラーは表示されません。もちろん、出力を保存して添付ファイルとして送信することは可能ですが、スクリプトがより複雑になります。
このスクリプトを見てください。
curl
は、URLを取得するコマンドラインユーティリティです。スクリプトは終了コードをチェックし($?はシェルスクリプトの最新のコマンドの終了コードを表します)、それが0以外の場合はエラーを報告します(終了コード0は通常、成功を表します)。 HUBの回答で述べたように、||
コマンドラインで実行して、最初のコマンドが失敗したときに2番目のコマンドを実行します。
ステータスがわかったら、メールを送信するだけです。次の例は、mail
コマンドを使用してシェルスクリプトからメールを送信します。テスト対象のボックスにSMTPが設定されていると想定しています。
ところで、シェルスクリプトが得意ではない場合は、シェルスクリプトに限定しないでください。 Rubyスクリプト、phpスクリプト、サーバーが実行できるあらゆる種類のスクリプトを使用できます!#!/path/to/executable
スクリプトの最初の行-たとえば、
#!/usr/bin/php
チェック このスクリプト 。それはウェブサイトのリストをチェックしていて、何か問題があるときはいつでも(メールのリストに)メールを送信します(200とは異なるHTTP応答)。スクリプトは.tempファイルを作成して、最後のチェックでどのWebサイトが失敗したかを「記憶」するため、複数のメールを受信しません。 .tempファイルは、Webサイトが再び機能しているときに削除されます。
#!/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
上記のスクリプトはすべてあなたが尋ねたものとまったく同じですが、Apacheがダウンしている場合はメールが送信されますが、(ダウンしている場合は)再起動されるため、monitを確認することをお勧めします。
これにはpingdomをお勧めします。彼らの無料サービスでは1つのサイトをチェックできますが、1つのサーバーをチェックするために必要なのはこれだけです。 iPhoneをお持ちの場合は、プッシュメッセージが無料で届くため、SMSクレジットを購入する必要はなく、複数の設定を使用できます。2回の再試行後に通知を受け取るように設定されています。 (10分)およびその後は10分ごとのダウンタイム。サイトがダウンしていることを示すHTTP 500メッセージもチェックするので、すばらしいです。失敗した場合は、別の場所にある別のサーバーからサイトをすぐに再度チェックします。失敗した場合、まあ、それはあなたが通知を受け取りたい方法/ときにあなたの好みをトリガーします。
#!/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: [email protected]" [email protected],[email protected] >> /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: [email protected]" [email protected],[email protected] >> /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: [email protected]" [email protected],[email protected] >> /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
上記のわずかなバリエーション。
Webサイトが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;
VPSには多くのサイトがあるため、Host-tracker.comなどのWebサイト監視サイトでアカウントを開くことをお勧めします。サイトがダウンしているかどうかを警告する以外に、ウルサイトの毎週、毎月、および毎年の稼働時間も提供します。ウィッシュは管理とパフォーマンスに非常に役立ちます。
これはどう:
#!/bin/bash
/etc/init.d/httpd status
if [[ $? == 3 ]]; then
echo "Httpd is down `date`" | mail [email protected]
exit 1
fi
exit 0