はじめに
最近、小さなサービスを作りすぎていて、気が付いていたら停止しているなんてことが時々あり、中には数時間、数日放置してしまったとかいうことがあって、少し困っている。
ということで、これらのファイルの更新日をチェックして、1時間以上ファイルが更新されていなかったら通知する仕組みを作ってみる。
条件
- 通知のメールはGMailを使用
- 生成されるファイルは[年月日].[拡張子]という形式
- スクリプトはホームディレクトリ直下に作成
スクリプト作成
以下の通り作成。
GMailのアカウントとパスワード、メール送信先は各自のものを使用。
check.py
#!/usr/bin/env python3
import requests, os, smtplib, ssl
from glob import glob
from datetime import datetime, timedelta
from email.mime.text import MIMEText
# メール送信関数
def send_info(name, subject, body):
gmail_account = "*****@gmail.com"
gmail_password = "*****"
mail_to = "*****@*****.com"
msg = MIMEText(body, "html")
msg["Subject"] = "[{}] {}".format(name, subject)
msg["To"] = mail_to
msg["From"] = gmail_account
server = smtplib.SMTP_SSL("smtp.gmail.com", 465,
context=ssl.create_default_context())
server.login(gmail_account, gmail_password)
server.send_message(msg)
# 更新日取得関数
def get_ctime(f):
t = os.stat(f).st_ctime
return datetime.fromtimestamp(t)
# ファイル更新確認関数
def isFileUpdated(f, hour):
t = get_ctime(f)
flg = True
if datetime.now() - t > timedelta(hours=hour):
flg = False
return flg
# 時間間隔
hour = 1
# データ保存先
dir = "/var/www/html/[myservice]/data/"
# 確認対象のファイル
types = [
"*.csv",
"*.jpg",
"*.txt"
]
for tp in types:
print(tp)
files = glob(dir + tp)
files.sort()
f = files[-1]
rs = isFileUpdated(f, hour)
if rs == False:
send_info(
"myservice",
"file is not updeted",
"Check a script."
)
print("mail send.")
実行
スクリプトに実行権限を付与。
chmod a+x check.py
試しに実行。
./check.py
GMailが送信できない場合の対処
GMailが送信できない場合は以下のURLをご参照下さい。
自動実行
cronに登録し、営業時間中(8時〜19時)に1時間ごとに確認して更新されていない場合にメールを送信する。
10 8-19 * * * /home/[ユーザー名]/check.py
できた!