概要
例えば */5 * * * *
は本日実行される cron で 30 12 22 6 *
は本日実行されない cron というのを判定することができるスクリプトを紹介します
環境
- macOS 11.7.10
- Python 3.11.7
- croniter 2.0.5
インストール
- pipenv install croniter
サンプルスクリプト
from datetime import datetime, timedelta
from croniter import croniter
def will_run_today(cron_expression):
# 今日の日付と今日の開始、明日の開始時刻を取得
now = datetime.now()
today_start = datetime(now.year, now.month, now.day) - timedelta(seconds=1)
tomorrow_start = today_start + timedelta(days=1) + timedelta(seconds=1)
# cron オブジェクトの作成
cron = croniter(cron_expression, today_start)
# 次に実行される日時を取得
next_run = cron.get_next(datetime)
# 次に実行される日時が今日中であればTrueを返す
return today_start < next_run < tomorrow_start
# テスト正常系(2024/06/21(木)に実行した想定)
print("正常系テスト")
print(will_run_today("0 12 * * *"))
print(will_run_today("*/5 * * * *"))
print(will_run_today("*/1 * * * *"))
print(will_run_today("*/30 * * * *"))
print(will_run_today("*/30 5 * * *"))
print(will_run_today("*/30 5 * 6 *"))
print(will_run_today("*/30 5 * 6 *"))
print(will_run_today("59 23 21 6 *"))
print(will_run_today("59 23 * * 5"))
print(will_run_today("59 23 21 6 5"))
print(will_run_today("1 0 21 6 5"))
print(will_run_today("0 0 * * *"))
print(will_run_today("0 0 21 6 5"))
print(will_run_today("*/30 * * * 1-5"))
# テスト異常系
print("異常系テスト")
print(will_run_today("0 12 3 2 *"))
print(will_run_today("0 12 22 6 *"))
print(will_run_today("*/5 * 22 6 *"))
print(will_run_today("*/1 * * * 4"))
print(will_run_today("*/1 * * * 0,1,2,3,4,6"))
print(will_run_today("30 12 22 * *"))
おまけ: 指定の日付に実行されたかどうかチェックするように修正する
from datetime import datetime, timedelta
from croniter import croniter
def will_run_today(cron_expression, target_date: str):
# 指定の日付の開始、指定の日付の明日の開始時刻を取得
target_datetime = datetime.strptime(target_date, "%Y/%m/%d")
today_start = datetime(
target_datetime.year, target_datetime.month, target_datetime.day
) - timedelta(seconds=1)
tomorrow_start = today_start + timedelta(days=1) + timedelta(seconds=1)
# cron オブジェクトの作成
cron = croniter(cron_expression, today_start)
# 次に実行される日時を取得
next_run = cron.get_next(datetime)
# 次に実行される日時が指定日時内であればTrueを返す
return today_start < next_run < tomorrow_start
# テスト正常系(2024/06/21(木)に実行した想定)
print("正常系テスト")
print(will_run_today("0 12 * * *", "2024/06/21"))
print(will_run_today("0 12 3 2 *", "2024/02/03"))
print(will_run_today("*/1 * * * *", "2024/01/01"))
print(will_run_today("0 0 * * *", "2024/01/01"))
# テスト異常系
print("異常系テスト")
print(will_run_today("0 12 22 6 *", "2024/06/21"))
最後に
cron が大量にありその中で本日実行されるのが何個あるのかチェックしたりするのに使えます
0 件のコメント:
コメントを投稿