ウェブサーバが落ちてたらgmailで通知してくれる
そんなスクリプトを書きました。
(ただし、パソコンが起動している間しか確認しません。だいたい1日中起動しているPC、あるいは別サーバ上で定期的に実行するといいかと。)
gmail以外でも、SMTPのサーバとポート番号を編集したら使えます。
ウェブサーバが気づいたら落ちてる、なんてこと、あってはいけないんですが、たまに起きます。
Zabbixとか導入する気力もリソースもないというか、ちょっと面倒なので、今回は家のPCから定期的にチェックすることにしました。
ついでに、ローカルストレージに結果を記録するようにしました。
スクリプト
下のスクリプトでは、HTTP GETを送信して、問題が発生したら、
メールで通知してくれる Python スクリプトです。
Python3.3, Windows で動作確認しました。
Macや、違うPythonバージョンの場合には、適時修正してください。
(スクリプト実行でいかなる損害があったとしても、一切責任を負いませんので、各自の責任の上、利用してください。)
#!/usr/bin/python
# coding: UTF-8
# ウェブサーバ 監視ツール
import http.client,datetime,os
#============設定項目==============
# Gメールのアカウント
gmail_sender = 'あなたのあかうんと@gmail.com'
# Gメールのパスワード
gmail_passwd = 'あなたのぱすわーど'
# エラーメール送信先
gmail_to = 'そうしんさき@メールアドレス'
# メールの件名
mail_subject = 'サーバーエラーが発生しています'
#チェックするサーバ
servers = ("www.あなたのさいと1.com","www.あなたのさいと2.net")
# ログ保存先ディレクトリ(相対パス)
log_dir = "webtestlog"
#=================================
import smtplib
from email.mime.text import MIMEText
# メール送信
def sendmail(data):
global gmail_sender,gmail_passwd,gmail_to,mail_subject
TEXT = data
# サインイン
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login(gmail_sender, gmail_passwd)
message = MIMEText(data,"plain","UTF-8")
message["Subject"] = mail_subject
message["From"] = gmail_sender
message["To"] = gmail_to
try:
server.sendmail(gmail_sender, [gmail_to], message.as_string())
print ('email sent')
except Exception as e:
print (e)
print ('error sending mail')
server.quit()
result = ""
error_detected = False
#結果のフォーマット。ここをカスタマイズすれば、もっと詳しい情報を追記したりとかできる。
def format_result(address,response):
return address +" "+ str(response.status) + " " + response.reason
#ルート・ディレクトリをチェックする
def checkroot(address):
global result,error_detected
conn = http.client.HTTPConnection( address )
try:
conn.request( "GET", "/" )
except:
result = result + address + " CANNOT GET\n"
error_detected = True
return
response = conn.getresponse()
if response.status != 200:
error_detected = True
result = result + format_result(address,response) + "\n"
conn.close()
# ここですべてのサーバをチェックする
for each in servers:
checkroot(each)
if not os.path.isdir(log_dir):
os.mkdir(log_dir)
now = datetime.datetime.now()
# 時間情報を埋め込む
result = str(now) + "\n" + result
# レスポンスの記録
filename = log_dir+"\log_"+now.strftime("%y-%m-%d")+".txt";
f = open(filename, 'a') # 追記モード
f.write(result) # 結果
f.close()
#エラーがあればメール送信
if error_detected:
sendmail(result);
実行結果
今はあえてURL間違えてエラー発生させてますが、500エラーとか発生したり、HTTP GET 実行時にエラーが発生したりしたら
このようにメールが来ます。
バッチファイル作成
pythonスクリプトは直接は実行できなかったと思うので、バッチファイルを作成します。
(webtest.pyスクリプトは、C:\bin に置いてあるとします。)
cd C:\bin
python webtest.py
cdしておかないと、webtest.py が見つからないよ!というエラーが発生しますので、ご注意を。
スケジューラ
上のスクリプトを1度実行してみて、正しく動いたら次はスケジュール化。
今回はWindowsのタスクスケジューラで定期的に実行することにしました。
コントロールパネル > "スケジュール" で検索 > タスクのスケジュール
タスクスケジューラが起動したら、「基本タスクの作成」で、適当に作ります。
トリガーは「毎日」にしておいてください。(あとで短時間に変えれます)
プログラムを選択するところで、先のバッチファイルを選択します。
X分ごとに確認
バックグラウンドにする
毎回ちらっとコマンドプロンプトが表示されるのは、うるさいので非表示にします。
プロパティ画面で、「ユーザーまたはグループの変更」> SYSTEM と入力してOK
「タスク実行時に使うユーザーアカウント:」が「NT AUTHORITY\SYSTEM」 とかになってればOKです。