agronholm / agronholm/apscheduler

after DST scheduler is stuck, jobs are not getting fired

Open
#1,036 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
Python
Stars
7.6k
Forks
783
Avg merge
4d 8h
Merged PRs (30d)
5

Description

### Things to check first

- [x] I have checked that my issue does not already have a solution in the [FAQ](https://apscheduler.readthedocs.io/en/master/faq.html)

- [x] I have searched the existing issues and didn't find my bug already reported there

- [x] I have checked that my bug is still present in the latest release

### Version

3.11.0

### What happened?

With the apscheduler's cron trigger, jobs are not triggered after the DST transition period.

### How can we reproduce the bug?

Set System time to 30 seconds prior to DST transition period - 2025-03-09 01:59:30 AM

```
import asyncio
from datetime import datetime

from apscheduler.schedulers.asyncio import AsyncIOScheduler

import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('apscheduler')
logger.setLevel(logging.DEBUG)

def tick():
print(f"Tick! The time is: {datetime.now()}")

async def main():
scheduler = AsyncIOScheduler()
scheduler.add_job(tick, "cron", second="*/7")
scheduler.start()
while True:
for job in scheduler.get_jobs():
print(f"==== timestamp:{datetime.now()}, scheduler jobs ==> Job "
f"{job.id} scheduled next run at: {job.next_run_time}====")
await asyncio.sleep(5)

if __name__ == "__main__":
try:
asyncio.run(main())
except (KeyboardInterrupt, SystemExit):
pass
```

execution output

```
DEBUG:asyncio:Using selector: KqueueSelector
DEBUG:tzlocal:/etc/localtime found
DEBUG:tzlocal:1 found:
{'/etc/localtime is a symlink to': 'America/Chicago'}
INFO:apscheduler.scheduler:Adding job tentatively -- it will be properly scheduled when the scheduler starts
INFO:apscheduler.scheduler:Added job "tick" to job store "default"
INFO:apscheduler.scheduler:Scheduler started
DEBUG:apscheduler.scheduler:Looking for jobs to run
DEBUG:apscheduler.scheduler:Next wakeup is due at 2025-03-09 01:59:35-06:00 (in 3.099565 seconds)
==== timestamp:2025-03-09 01:59:31.900390, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 01:59:35-06:00====
DEBUG:apscheduler.scheduler:Looking for jobs to run
INFO:apscheduler.executors.default:Running job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 01:59:35 CST)" (scheduled at 2025-03-09 01:59:35-06:00)
INFO:apscheduler.executors.default:Job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 01:59:35 CST)" executed successfully
DEBUG:apscheduler.scheduler:Next wakeup is due at 2025-03-09 01:59:42-06:00 (in 6.994773 seconds)
Tick! The time is: 2025-03-09 01:59:35.004849
==== timestamp:2025-03-09 01:59:36.900796, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 01:59:42-06:00====
==== timestamp:2025-03-09 01:59:41.901411, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 01:59:42-06:00====
Tick! The time is: 2025-03-09 01:59:42.001396
DEBUG:apscheduler.scheduler:Looking for jobs to run
DEBUG:apscheduler.scheduler:Next wakeup is due at 2025-03-09 01:59:49-06:00 (in 6.999166 seconds)
INFO:apscheduler.executors.default:Running job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 01:59:49 CST)" (scheduled at 2025-03-09 01:59:42-06:00)
INFO:apscheduler.executors.default:Job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 01:59:49 CST)" executed successfully
==== timestamp:2025-03-09 01:59:46.902171, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 01:59:49-06:00====
DEBUG:apscheduler.scheduler:Looking for jobs to run
DEBUG:apscheduler.scheduler:Next wakeup is due at 2025-03-09 01:59:56-06:00 (in 6.998527 seconds)
INFO:apscheduler.executors.default:Running job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 01:59:56 CST)" (scheduled at 2025-03-09 01:59:49-06:00)
INFO:apscheduler.executors.default:Job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 01:59:56 CST)" executed successfully
Tick! The time is: 2025-03-09 01:59:49.001911
==== timestamp:2025-03-09 01:59:51.902916, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 01:59:56-06:00====
DEBUG:apscheduler.scheduler:Looking for jobs to run
DEBUG:apscheduler.scheduler:Next wakeup is due at 2025-03-09 03:00:00-05:00 (in 3603.999241 seconds)
INFO:apscheduler.executors.default:Running job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 03:00:00 CDT)" (scheduled at 2025-03-09 01:59:56-06:00)
INFO:apscheduler.executors.default:Job "tick (trigger: cron[second='*/7'], next run at: 2025-03-09 03:00:00 CDT)" executed successfully
Tick! The time is: 2025-03-09 01:59:56.001176
==== timestamp:2025-03-09 01:59:56.903779, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 03:00:00-05:00====
==== timestamp:2025-03-09 03:00:01.904669, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 03:00:00-05:00====
==== timestamp:2025-03-09 03:00:06.905596, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 03:00:00-05:00====
==== timestamp:2025-03-09 03:00:11.906636, scheduler jobs ==> Job cc015b86296049cb8bdf58909341dcf1 scheduled next run at: 2025-03-09 03:00:00-05:00====
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.