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, сокет никогда не закрывается, пока я не перезапущу задание.

Есть идеи, как это исправить?

Вернуться на верх