Django supervisord и apscheduler
В проекте Django есть супервизор, чем запускать апшедулер
[program:apscheduler]
command=/home/user/Project/.venv/bin/python manage.py runapscheduler
В apscheduler у меня есть одно задание:
# runapscheduler.py
import logging
import sys
from django.conf import settings
from django.core import management
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
from django.core.management.base import BaseCommand
from django_apscheduler.jobstores import DjangoJobStore
from django_apscheduler.models import DjangoJobExecution
from django_apscheduler import util
logger = logging.getLogger(__name__)
def my_management_command():
management.call_command('MyCommand')
# The `close_old_connections` decorator ensures that database connections, that have become unusable or are obsolete,
# are closed before and after our job has run.
@util.close_old_connections
def delete_old_job_executions(max_age=604_800):
"""
This job deletes APScheduler job execution entries older than `max_age` from the database. It helps to prevent the
database from filling up with old historical records that are no longer useful.
:param max_age: The maximum length of time to retain historical job execution records. Defaults
to 7 days.
"""
DjangoJobExecution.objects.delete_old_job_executions(max_age)
class Command(BaseCommand):
help = "Runs APScheduler."
def handle(self, *args, **options):
scheduler = BlockingScheduler(timezone=settings.TIME_ZONE)
scheduler.add_jobstore(DjangoJobStore(), "default")
scheduler.add_job(
my_management_command,
trigger=CronTrigger(hour="*", minute="*"), # Every hour
id="MyCommand", # The `id` assigned to each job MUST be unique
max_instances=1,
replace_existing=True,
)
logger.info("Added hourly job 'my_management_command'.")
scheduler.add_job(
delete_old_job_executions,
trigger=CronTrigger(
day_of_week="mon", hour="00", minute="00"
), # Midnight on Monday, before start of the next work week.
id="delete_old_job_executions",
max_instances=1,
replace_existing=True,
)
logger.info(
"Added weekly job: 'delete_old_job_executions'."
)
try:
logger.info("Starting scheduler...")
scheduler.start()
except KeyboardInterrupt:
logger.info("Stopping scheduler...")
scheduler.shutdown()
logger.info("Scheduler shut down successfully!")
В моей команде управления "MyCommand", я открываю некоторый tcp сокет на другой сервер. Если я запускаю ее вне apscheduler, сокет закрывается корректно после завершения команды управления.
Когда он запущен с apscheduler, сокет никогда не закрывается, пока я не перезапущу задание.
Есть идеи, как это исправить?