LoginSignup
8
15

More than 5 years have passed since last update.

ウェブサーバのHTTPリスポンスを定期的に監視する

Last updated at Posted at 2014-04-09

ウェブサーバが落ちてたらgmailで通知してくれる

そんなスクリプトを書きました。
(ただし、パソコンが起動している間しか確認しません。だいたい1日中起動しているPC、あるいは別サーバ上で定期的に実行するといいかと。)

gmail以外でも、SMTPのサーバとポート番号を編集したら使えます。

ウェブサーバが気づいたら落ちてる、なんてこと、あってはいけないんですが、たまに起きます。
Zabbixとか導入する気力もリソースもないというか、ちょっと面倒なので、今回は家のPCから定期的にチェックすることにしました。
ついでに、ローカルストレージに結果を記録するようにしました。

スクリプト

下のスクリプトでは、HTTP GETを送信して、問題が発生したら、
メールで通知してくれる Python スクリプトです。

Python3.3, Windows で動作確認しました。
Macや、違うPythonバージョンの場合には、適時修正してください。

(スクリプト実行でいかなる損害があったとしても、一切責任を負いませんので、各自の責任の上、利用してください。)

webtest.py
#!/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 実行時にエラーが発生したりしたら
このようにメールが来ます。

result.png

バッチファイル作成

pythonスクリプトは直接は実行できなかったと思うので、バッチファイルを作成します。
(webtest.pyスクリプトは、C:\bin に置いてあるとします。)

webtest.bat
cd C:\bin
python webtest.py

cdしておかないと、webtest.py が見つからないよ!というエラーが発生しますので、ご注意を。

スケジューラ

上のスクリプトを1度実行してみて、正しく動いたら次はスケジュール化。
今回はWindowsのタスクスケジューラで定期的に実行することにしました。

コントロールパネル > "スケジュール" で検索 > タスクのスケジュール

n.png

タスクスケジューラが起動したら、「基本タスクの作成」で、適当に作ります。
トリガーは「毎日」にしておいてください。(あとで短時間に変えれます)
プログラムを選択するところで、先のバッチファイルを選択します。

X分ごとに確認

トリガーを編集します。
fsa.png

バックグラウンドにする

毎回ちらっとコマンドプロンプトが表示されるのは、うるさいので非表示にします。

プロパティ画面で、「ユーザーまたはグループの変更」> SYSTEM と入力してOK
「タスク実行時に使うユーザーアカウント:」が「NT AUTHORITY\SYSTEM」 とかになってればOKです。

aa.png

8
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
15