2024年6月24日月曜日

Python で指定の cron が当日実行されるかチェックするスクリプト

Python で指定の cron が当日実行されるかチェックするスクリプト

概要

例えば */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 件のコメント:

コメントを投稿