`-m cron.scheduler` runs `cron/__init__.py` before the module itself. That
file's first import, `cron.jobs` -> `hermes_yaml` -> `ruamel`, is already a
third-party dependency. With the boot at the top of `cron/scheduler.py`, the
worker imported through the pinned PYTHONPATH alone:
- no lease on the generation was held yet;
- no `.pth` files had run;
- with the dependency pin removed, it still died with
"No module named 'ruamel'".
Run the marked-worker boot at the top of `cron/__init__.py`, under a private
alias, so the package attribute `cron.worker_bootstrap` stays the module. Drop
the now-redundant call in `scheduler.py`. Replace the in-process marker test
with a subprocess test: the boot runs before `cron.jobs` is imported, runs
exactly once, consumes the marker, and never fires for an unmarked importer.
Also add the missing trailing newlines on the two new files.
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
"""Cron job scheduling for Hermes Agent: scheduled tasks (cron expressions, intervals, one-shot),
|
|
self-scheduled reminders, isolated sessions. The gateway daemon (``hermes gateway [install]``) ticks
|
|
the scheduler every 60 seconds; a file lock prevents duplicate execution across processes.
|
|
"""
|
|
|
|
# The restart-safe external worker runs as ``-m cron.scheduler``, which executes this package
|
|
# first: boot PM dependencies before ``cron.jobs`` reaches a third-party import. A no-op
|
|
# unless ``_launch_external_cron_worker`` marked this process. See cron/worker_bootstrap.py.
|
|
from cron.worker_bootstrap import worker_bootstrap as _boot_external_worker
|
|
|
|
_boot_external_worker()
|
|
|
|
from cron.jobs import ( # noqa: E402
|
|
create_job,
|
|
get_job,
|
|
list_jobs,
|
|
remove_job,
|
|
update_job,
|
|
pause_job,
|
|
resume_job,
|
|
trigger_job,
|
|
rearm_oneshot,
|
|
JOBS_FILE,
|
|
)
|
|
from cron.scheduler import tick # noqa: E402
|
|
|
|
__all__ = [
|
|
"create_job",
|
|
"get_job",
|
|
"list_jobs",
|
|
"remove_job",
|
|
"update_job",
|
|
"pause_job",
|
|
"resume_job",
|
|
"trigger_job",
|
|
"rearm_oneshot",
|
|
"tick",
|
|
"JOBS_FILE",
|
|
]
|