diff --git a/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py b/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py index 3f7bf689ef..0094b8abe4 100644 --- a/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py +++ b/frappe/core/doctype/scheduled_job_type/scheduled_job_type.py @@ -115,7 +115,7 @@ class ScheduledJobType(Document): } if not self.cron_format: - self.cron_format = CRON_MAP[self.frequency] + self.cron_format = CRON_MAP.get(self.frequency) # If this is a cold start then last_execution will not be set. # Creation is set as fallback because if very old fallback is set job might trigger diff --git a/frappe/utils/scheduler.py b/frappe/utils/scheduler.py index d9e1259668..3081339259 100644 --- a/frappe/utils/scheduler.py +++ b/frappe/utils/scheduler.py @@ -15,6 +15,7 @@ import time from typing import NoReturn import setproctitle +from croniter import CroniterBadCronError # imports - module imports import frappe @@ -100,8 +101,13 @@ def enqueue_events() -> list[str] | None: enqueued_jobs = [] for job_type in frappe.get_all("Scheduled Job Type", filters={"stopped": 0}, fields="*"): job_type = frappe.get_doc(doctype="Scheduled Job Type", **job_type) - if job_type.enqueue(): - enqueued_jobs.append(job_type.method) + try: + if job_type.enqueue(): + enqueued_jobs.append(job_type.method) + except CroniterBadCronError: + frappe.logger("scheduler").error( + f"Invalid Job on {frappe.local.site} - {job_type.name}", exc_info=True + ) return enqueued_jobs