صيغة cron مختصرة لكنها عرضة للأخطاء، ومن السهل كتابة تعبير لا يعمل في الوقت المتوقع. تأخذ هذه الأداة أي تعبير cron قياسي من خمسة حقول وتطبع المواعيد التالية لتشغيله بعدد N، حتى تتحقق من صحة الجدول قبل نشره. تعتمد على مكتبة croniter التي تفهم النطاقات والخطوات والقوائم تمامًا كما يفعل cron. يُتحقق من صحة التعبير مسبقًا عبر croniter.is_valid فيعطي رسالة خطأ واضحة بدلًا من تتبع معقد عند الأخطاء الإملائية. يُعرض كل تشغيل قادم بطابعه الزمني المطلق وعد تنازلي مقروء، فيتضح إن كانت "كل 15 دقيقة" تعني فعلًا ما قصدته. يبدّل الخيار --utc بين التوقيت المحلي وتوقيت UTC، وهو مهم عندما تكون خوادمك وجهازك في مناطق زمنية مختلفة. التثبيت: pip install croniter.
حاسبة موعد التشغيل التالي لتعبير cron
عند إعطاء تعبير cron يطبع المواعيد التالية لتشغيله مع العد التنازلي لكل منها.
16 مشاهدة
مشاركة
السكربت
تحميل .pypython
#!/usr/bin/env python3
"""Calculate the next run times for a cron expression.
Dependency: pip install croniter
"""
import argparse
from datetime import datetime, timezone
from croniter import croniter, CroniterBadCronError
def next_runs(expression, count, base):
"""Return a list of the next `count` datetimes after `base`."""
itr = croniter(expression, base)
return [itr.get_next(datetime) for _ in range(count)]
def main():
parser = argparse.ArgumentParser(
description="Compute upcoming run times for a cron expression.")
parser.add_argument("expression",
help='Cron expression, e.g. "*/15 * * * *".')
parser.add_argument("-n", "--count", type=int, default=5,
help="How many upcoming runs to show (default: 5).")
parser.add_argument("--utc", action="store_true",
help="Use UTC instead of local time.")
args = parser.parse_args()
base = datetime.now(timezone.utc) if args.utc else datetime.now()
# Validate the expression before computing anything.
if not croniter.is_valid(args.expression):
print(f"Invalid cron expression: {args.expression}")
return
try:
runs = next_runs(args.expression, args.count, base)
except CroniterBadCronError as exc:
print(f"Error: {exc}")
return
tz_label = "UTC" if args.utc else "local"
print(f"Cron: {args.expression}")
print(f"From: {base.strftime('%Y-%m-%d %H:%M:%S')} ({tz_label})\n")
for i, run in enumerate(runs, start=1):
delta = run - base
print(f"{i:>2}. {run.strftime('%Y-%m-%d %H:%M:%S')} "
f"(in {str(delta).split('.')[0]})")
if __name__ == "__main__":
main()كيفية التشغيل
راجع السكربت أولاً، ثم حمّله أو انسخه وشغّله في بيئتك.
قد يعجبك أيضاً
pythoncross-platformمتوسط
التحقق من ملف .env مقابل مخطط
التأكد من أن ملف .env يحتوي على كل المتغيرات المطلوبة بالأنواع الصحيحة قبل بدء تشغيل التطبيق.
bashlinuxمبتدئ
تنبيه تجاوز عتبة استخدام القرص
يرسل بريداً إلكترونياً للمسؤول عند تجاوز أي قسم مثبّت لنسبة استخدام محددة.
bashlinuxمبتدئ
عرض نسخ الحوسبة في GCP
إظهار كل آلة افتراضية في Compute Engine ضمن مشروع مع المنطقة ونوع الآلة والحالة وعناوين IP.