agronholm / apscheduler

Task scheduling library for Python
MIT License
5.98k stars 694 forks source link

BackgroundSchedule suddenly stops working after running for a period of time #870

Open 1476339526 opened 5 months ago

1476339526 commented 5 months ago

Things to check first

Version

3.9.1

What happened?

I have set logging. getLogger ('apscheduler '). setLevel (logging. DEBUG), and it will be executed last from 07:20:00 on February 21, 2024. After that, the task will not be executed, and the service can still be accessed normally. I am using FastAPI. No abnormalities were found in the logs, and the obtained logs are as follows:

Log output

2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Adding job tentatively -- it will be properly scheduled when the scheduler starts 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Added job "JobService.exec_compile" to job store "default" 2024-02-20 16:38:07 - INFO - Scheduler started 2024-02-20 16:38:07 - DEBUG - Looking for jobs to run 2024-02-20 16:38:07 - DEBUG - Next wakeup is due at 2024-02-20 16:38:40+08:00 (in 32.189897 seconds) 2024-02-20 16:38:40 - DEBUG - Looking for jobs to run 2024-02-20 16:38:40 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:38:40 CST)" (scheduled at 2024-02-20 16:38:40+08:00) 2024-02-20 16:38:40 - DEBUG - Next wakeup is due at 2024-02-20 16:38:50+08:00 (in 9.999347 seconds) 2024-02-20 16:38:50 - DEBUG - Looking for jobs to run 2024-02-20 16:38:50 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:38:50 CST)" (scheduled at 2024-02-20 16:38:50+08:00) 2024-02-20 16:38:50 - DEBUG - Next wakeup is due at 2024-02-20 16:39:00+08:00 (in 9.997473 seconds) 2024-02-20 16:38:50 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:39:00 CST)" executed successfully 2024-02-20 16:38:50 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:39:00 CST)" executed successfully 2024-02-20 16:39:00 - DEBUG - Looking for jobs to run 2024-02-20 16:39:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:39:00 CST)" (scheduled at 2024-02-20 16:39:00+08:00) 2024-02-20 16:39:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:39:00 CST)" (scheduled at 2024-02-20 16:39:00+08:00) 2024-02-20 16:39:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-20 16:39:00 CST)" (scheduled at 2024-02-20 16:39:00+08:00) 2024-02-20 16:39:00 - DEBUG - Next wakeup is due at 2024-02-20 16:39:40+08:00 (in 39.995614 seconds) 2024-02-20 16:39:00 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:39:50 CST)" executed successfully 2024-02-20 16:39:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-20 16:40:00 CST)" executed successfully 2024-02-20 16:39:19 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:39:40 CST)" executed successfully 2024-02-20 16:39:40 - DEBUG - Looking for jobs to run 2024-02-20 16:39:40 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:39:40 CST)" (scheduled at 2024-02-20 16:39:40+08:00) 2024-02-20 16:39:40 - DEBUG - Next wakeup is due at 2024-02-20 16:39:50+08:00 (in 9.996017 seconds) 2024-02-20 16:39:49 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:40:00 CST)" executed successfully 2024-02-20 16:39:50 - DEBUG - Looking for jobs to run 2024-02-20 16:39:50 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:39:50 CST)" (scheduled at 2024-02-20 16:39:50+08:00) 2024-02-20 16:39:50 - DEBUG - Next wakeup is due at 2024-02-20 16:40:00+08:00 (in 9.998374 seconds) 2024-02-20 16:39:50 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:40:00 CST)" executed successfully 2024-02-20 16:40:00 - DEBUG - Looking for jobs to run 2024-02-20 16:40:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/10'], next run at: 2024-02-20 16:40:00 CST)" (scheduled at 2024-02-20 16:40:00+08:00) 2024-02-20 16:40:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/5'], next run at: 2024-02-20 16:40:00 CST)" (scheduled at 2024-02-20 16:40:00+08:00) 2024-02-20 16:40:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:40:00 CST)" (scheduled at 2024-02-20 16:40:00+08:00) 2024-02-20 16:40:00 - DEBUG - Next wakeup is due at 2024-02-20 16:40:40+08:00 (in 39.997967 seconds) 2024-02-20 16:40:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:40:40 CST)" (scheduled at 2024-02-20 16:40:00+08:00) 2024-02-20 16:40:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-20 16:41:00 CST)" (scheduled at 2024-02-20 16:40:00+08:00) 2024-02-20 16:40:00 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:40:50 CST)" executed successfully 2024-02-20 16:40:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-20 16:41:00 CST)" executed successfully 2024-02-20 16:40:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/10'], next run at: 2024-02-20 16:50:00 CST)" executed successfully 2024-02-20 16:40:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/5'], next run at: 2024-02-20 16:45:00 CST)" executed successfully 2024-02-20 16:40:10 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:40:40 CST)" executed successfully 2024-02-20 16:40:40 - DEBUG - Looking for jobs to run 2024-02-20 16:40:40 - DEBUG - Next wakeup is due at 2024-02-20 16:40:50+08:00 (in 9.992855 seconds) 2024-02-20 16:40:40 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:41:00 CST)" (scheduled at 2024-02-20 16:40:40+08:00) 2024-02-20 16:40:49 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:41:00 CST)" executed successfully 2024-02-20 16:40:50 - DEBUG - Looking for jobs to run 2024-02-20 16:40:50 - DEBUG - Next wakeup is due at 2024-02-20 16:41:00+08:00 (in 9.998182 seconds) 2024-02-20 16:40:50 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:41:00 CST)" (scheduled at 2024-02-20 16:40:50+08:00) 2024-02-20 16:40:50 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:41:00 CST)" executed successfully 2024-02-20 16:41:00 - DEBUG - Looking for jobs to run 2024-02-20 16:41:00 - DEBUG - Next wakeup is due at 2024-02-20 16:41:40+08:00 (in 39.998935 seconds) 2024-02-20 16:41:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:41:50 CST)" (scheduled at 2024-02-20 16:41:00+08:00) 2024-02-20 16:41:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:41:40 CST)" (scheduled at 2024-02-20 16:41:00+08:00) 2024-02-20 16:41:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-20 16:42:00 CST)" (scheduled at 2024-02-20 16:41:00+08:00) 2024-02-20 16:41:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-20 16:42:00 CST)" executed successfully 2024-02-20 16:41:00 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-20 16:41:50 CST)" executed successfully 2024-02-20 16:41:10 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-20 16:41:40 CST)" executed successfully 2024-02-20 16:41:40 - DEBUG - Looking for jobs to run 2024-02-20 16:41:40 - DEBUG - Next wakeup is due at 2024-02-20 16:41:50+08:00 (in 9.998590 seconds) 2024-02-20 16:41:40 - INFO - Running job "JobService.exec_compile (trigger: cron[second='*/40'], next run at: 2024-02-20 16:42:00 CST)" (scheduled at 2024-02-20 16:41:40+08:00) 2024-02-20 16:41:50 - DEBUG - Looking for jobs to run ... 2024-02-21 07:17:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:18:00 CST)" (scheduled at 2024-02-21 07:17:00+08:00) 2024-02-21 07:17:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:18:00 CST)" executed successfully 2024-02-21 07:17:00 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:17:50 CST)" executed successfully 2024-02-21 07:17:10 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:17:40 CST)" executed successfully 2024-02-21 07:17:40 - DEBUG - Looking for jobs to run 2024-02-21 07:17:40 - DEBUG - Next wakeup is due at 2024-02-21 07:17:50+08:00 (in 9.998795 seconds) 2024-02-21 07:17:40 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:18:00 CST)" (scheduled at 2024-02-21 07:17:40+08:00) 2024-02-21 07:17:49 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:18:00 CST)" executed successfully 2024-02-21 07:17:50 - DEBUG - Looking for jobs to run 2024-02-21 07:17:50 - DEBUG - Next wakeup is due at 2024-02-21 07:18:00+08:00 (in 9.999012 seconds) 2024-02-21 07:17:50 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:18:00 CST)" (scheduled at 2024-02-21 07:17:50+08:00) 2024-02-21 07:17:50 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:18:00 CST)" executed successfully 2024-02-21 07:18:00 - DEBUG - Looking for jobs to run 2024-02-21 07:18:00 - DEBUG - Next wakeup is due at 2024-02-21 07:18:40+08:00 (in 39.998826 seconds) 2024-02-21 07:18:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:18:50 CST)" (scheduled at 2024-02-21 07:18:00+08:00) 2024-02-21 07:18:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:18:40 CST)" (scheduled at 2024-02-21 07:18:00+08:00) 2024-02-21 07:18:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:19:00 CST)" (scheduled at 2024-02-21 07:18:00+08:00) 2024-02-21 07:18:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:19:00 CST)" executed successfully 2024-02-21 07:18:00 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:18:50 CST)" executed successfully 2024-02-21 07:18:10 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:18:40 CST)" executed successfully 2024-02-21 07:18:40 - DEBUG - Looking for jobs to run 2024-02-21 07:18:40 - DEBUG - Next wakeup is due at 2024-02-21 07:18:50+08:00 (in 9.998379 seconds) 2024-02-21 07:18:40 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:19:00 CST)" (scheduled at 2024-02-21 07:18:40+08:00) 2024-02-21 07:18:49 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:19:00 CST)" executed successfully 2024-02-21 07:18:50 - DEBUG - Looking for jobs to run 2024-02-21 07:18:50 - DEBUG - Next wakeup is due at 2024-02-21 07:19:00+08:00 (in 9.998948 seconds) 2024-02-21 07:18:50 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:19:00 CST)" (scheduled at 2024-02-21 07:18:50+08:00) 2024-02-21 07:18:50 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:19:00 CST)" executed successfully 2024-02-21 07:19:00 - DEBUG - Looking for jobs to run 2024-02-21 07:19:00 - DEBUG - Next wakeup is due at 2024-02-21 07:19:40+08:00 (in 39.999175 seconds) 2024-02-21 07:19:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:19:50 CST)" (scheduled at 2024-02-21 07:19:00+08:00) 2024-02-21 07:19:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:19:40 CST)" (scheduled at 2024-02-21 07:19:00+08:00) 2024-02-21 07:19:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:20:00 CST)" (scheduled at 2024-02-21 07:19:00+08:00) 2024-02-21 07:19:00 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:19:50 CST)" executed successfully 2024-02-21 07:19:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:20:00 CST)" executed successfully 2024-02-21 07:19:09 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:19:40 CST)" executed successfully 2024-02-21 07:19:40 - DEBUG - Looking for jobs to run 2024-02-21 07:19:40 - DEBUG - Next wakeup is due at 2024-02-21 07:19:50+08:00 (in 9.998658 seconds) 2024-02-21 07:19:40 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:20:00 CST)" (scheduled at 2024-02-21 07:19:40+08:00) 2024-02-21 07:19:49 - INFO - Job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:20:00 CST)" executed successfully 2024-02-21 07:19:50 - DEBUG - Looking for jobs to run 2024-02-21 07:19:50 - DEBUG - Next wakeup is due at 2024-02-21 07:20:00+08:00 (in 9.999007 seconds) 2024-02-21 07:19:50 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:20:00 CST)" (scheduled at 2024-02-21 07:19:50+08:00) 2024-02-21 07:19:50 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:20:00 CST)" executed successfully 2024-02-21 07:20:00 - DEBUG - Looking for jobs to run 2024-02-21 07:20:00 - DEBUG - Next wakeup is due at 2024-02-21 07:20:40+08:00 (in 39.998982 seconds) 2024-02-21 07:20:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/10'], next run at: 2024-02-21 07:30:00 CST)" (scheduled at 2024-02-21 07:20:00+08:00) 2024-02-21 07:20:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/5'], next run at: 2024-02-21 07:25:00 CST)" (scheduled at 2024-02-21 07:20:00+08:00) 2024-02-21 07:20:00 - INFO - Running job "JobService.exec_compile (trigger: cron[day='', hour='7', minute='20', second='0'], next run at: 2024-02-22 07:20:00 CST)" (scheduled at 2024-02-21 07:20:00+08:00) 2024-02-21 07:20:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:20:50 CST)" (scheduled at 2024-02-21 07:20:00+08:00) 2024-02-21 07:20:00 - INFO - Running job "JobService.exec_compile (trigger: cron[second='/40'], next run at: 2024-02-21 07:20:40 CST)" (scheduled at 2024-02-21 07:20:00+08:00) 2024-02-21 07:20:00 - INFO - Running job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:21:00 CST)" (scheduled at 2024-02-21 07:20:00+08:00) 2024-02-21 07:20:00 - INFO - Job "JobService.exec_compile (trigger: cron[second='/50'], next run at: 2024-02-21 07:20:50 CST)" executed successfully 2024-02-21 07:20:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='/1'], next run at: 2024-02-21 07:21:00 CST)" executed successfully 2024-02-21 07:20:00 - INFO - Job "JobService.exec_compile (trigger: cron[minute='*/10'], next run at: 2024-02-21 07:30:00 CST)" executed successfully

How can we reproduce the bug?

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from apscheduler.events import *
from apscheduler.schedulers.base import *

scheduler = BackgroundScheduler(job_defaults={'coalesce': True, 'misfire_grace_time': None, 'max_instances': 5})

class ScheduleService:
    __scheduler = scheduler
    result = {}

    @classmethod
    def invoke(cls):
        if not cls.__scheduler:
            cls.__scheduler = scheduler
        return cls.__scheduler

    @classmethod
    def scheduler_stat(cls):
        if cls.__scheduler:
            return cls.__scheduler.state
        return -1

    @classmethod
    def run(cls):
        if not cls.__scheduler:
            cls.invoke()
        if cls.__scheduler.state != STATE_RUNNING:
            cls.__scheduler.start()
            cls.__scheduler.add_listener(cls.run_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)

    @classmethod
    def run_listener(cls, event):
        dtime = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        if event.exception:
            cls.result[event.job_id] = {"datetime": dtime, "flag": 1, "remark": "异常"}
        else:
            cls.result[event.job_id] = {"datetime": dtime, "flag": 0, "remark": "正常"}

    @classmethod
    def cron_to_trigger(cls, **kwargs):
        if kwargs:
            trigger = CronTrigger(**kwargs)
            return trigger

    @classmethod
    def add_job(cls, func, args, trigger, job_id):
        if not cls.__scheduler:
            cls.invoke()
        cls.__scheduler.add_job(func=func, args=args, trigger=trigger, id=job_id)

    @classmethod
    def modify_job(cls, job_id, args, trigger):
        if job_id:
            cls.__scheduler.get_job(job_id=job_id).modify(args=args, trigger=trigger)

    @classmethod
    def remove_job(cls, job_id):
        if cls.__scheduler:
            cls.__scheduler.remove_job(job_id=job_id)

    @classmethod
    def remove_all_jobs(cls):
        if cls.__scheduler:
            cls.__scheduler.remove_all_jobs()

    @classmethod
    def shutdown(cls):
        if cls.__scheduler:
            cls.__scheduler.shutdown(wait=False)

    @classmethod
    def get_jobs(cls):
        if cls.__scheduler:
            return cls.__scheduler.get_jobs()

    @classmethod
    def has_job(cls, job_id):
        jobs = cls.get_jobs()
        if jobs:
            ids = [x.id for x in jobs]
            if job_id in ids:
                return True
        return False

    @classmethod
    def print_jobs(cls):
        if cls.__scheduler:
            cls.__scheduler.print_jobs()

    if __name__ == "__main__":
        ...
agronholm commented 5 months ago

The provided script just exits immediately when I run it.

agronholm commented 5 months ago

Also, is all that complexity really necessary to reproduce the issue?