Flask APScheduler - Cron Job происходит только с активными пользователями на странице

У меня внутренняя веб-страница с низким трафиком, которую мы используем для управления удаленными компьютерами.

Эта веб-страница пытается зарегистрировать задание CRON, поэтому раз в неделю в указанное время в список будет отправляться электронное письмо с текущим статусом данных из базы данных.

Однако при тестировании все оказалось нормально. При запуске в продакшн я тестировал работу cron, она работала. Но если оставить систему работать на выходных (когда, возможно, в системе никого нет), задание не выполняется.

Я пробовал инициализировать несколько разных способов, чтобы он не (не должен) быть привязан к каким-либо запросам в системе и должен регистрироваться при инициализации, независимо от того, попал ли кто-нибудь в систему.

mmsver.wsgi

from flask_apscheduler.scheduler import APScheduler
from nydps.web.mmserver import app as application

scheduler = APScheduler()
scheduler.init_app(application)
scheduler.start()

mmserver.py (отрывок)

def weekly_report():
    # doing things with a session
    # send_smtp is a custom smtp function
    send_smtp(smtp_content, destination, smtpSender, 'TMM Directory: Weekly Utilization Report')

app.config['JOBS'] = [{
    'id': 'weekly_report',
    'func': weekly_report,
    'trigger': {
        'type': 'cron',
        'day_of_week': weekly_report_day_of_week,
        'hour': weekly_report_hour,
        'minute': weekly_report_minute
    }
}]

Если пойду, поменяю отчет день, час, минуту. Перезагрузите сервер, он запустится. Только когда я устанавливаю дневной час и минуту на время в немного более отдаленном будущем (когда я не нахожусь на сайте активно), похоже, что оно не выполняется.

Есть предположения?

Изменить: производство развертывается за Apache с использованием WAMP в Windows.


person Busturdust    schedule 07.07.2016    source источник
comment
Некоторое время назад у меня была похожая проблема с django в Linux. Проблема заключалась в том, что ротация журналов Apache перезапустила веб-сервер, но не перезапустила приложение wsgi, пока оно не получило запрос на это. Могли бы вы попасть в то же самое?   -  person Peter Brittain    schedule 12.07.2016
comment
Спасибо за вклад, это очень интересно. У меня включена ротация журналов с помощью apache, но я не уверен, как это взаимодействует с перезапуском веб-сервера? Я предполагаю, что логическим завершением было бы протестировать его с отключенной ротацией логов, мне нужно будет попробовать это позже на этой неделе.   -  person Busturdust    schedule 12.07.2016
comment
На прошлой неделе я был в отпуске, но я, конечно, не забыл об этой беседе. К сожалению, похоже, что он пропустил назначенную встречу (суббота, выходной день), даже если ротация журнала отключена. Я действительно надеялся ограничить любую дополнительную сложность с помощью таких вещей, как планировщик задач, так как я должен сначала продать его сотрудникам службы поддержки, я думаю, еще немного времени на решение проблемы, прежде чем я пойду по этому пути.   -  person Busturdust    schedule 17.07.2016
comment
На данный момент все, о чем я могу думать, - это попытаться поймать Завершение работы интерпретатора Python и наблюдение за его завершением, а затем возвращение оттуда ...   -  person Peter Brittain    schedule 17.07.2016


Ответы (2)


IMHO, использовать Apache + Webapp для выполнения запланированных задач - не лучшая идея.

Если вы работаете под Windows, почему бы вам не добавить задачу в Планировщик заданий? Вы можете запускать сценарии Python (используя сценарий BAT).

  1. Создайте автономное приложение Python,
  2. Разверните приложение в Windows,
  3. Создайте новую задачу в Планировщике заданий.

Создать автономное приложение Python

Вы можете разрабатывать в Linux или Windows, но вам нужно подготовить выпуск в Windows:

Сначала установите Python в Windows с pip, setuptools и wheel. Добавьте C:\{PYTHON_INSTALL_DIR}\Scripts к своему PATH для простоты.

Как администратор создайте целевую структуру каталогов в C:\Program Files\{YOUR_COMPANY}.

С помощью консоли MS-DOS создайте virtualenv и активируйте его:

C:
CD C:\Program Files\{YOUR_COMPANY}
virtualenv {YOUR_APP_NAME}
{YOUR_APP_NAME}\Scripts\activate

Установите ваше приложение:

pip install {YOUR_APP_NAME}   # if on PyPi
pip install {YOUR_WHEEL}      # if on another source (ex.: a file)

Теперь вы можете сжать папку C:\Program Files\{YOUR_COMPANY} в ZIP-файл и опубликовать его: например: "{YOUR_APP_NAME} -py2-win64.zip".

Развернуть приложение в Windows

В Windows загрузите ZIP-файл "{YOUR_APP_NAME} -py2-win64.zip" и распакуйте его.

Как администратор скопируйте несжатую папку {YOUR_COMPANY}\{YOUR_APP_NAME} в C:\Program Files\{YOUR_COMPANY}.

Запустите сценарий установки, если он у вас есть, или обновите файлы конфигурации.

Создать новую задачу в Планировщике заданий

Путь к исполняемому файлу Python будет:

"C:\Program Files\{YOUR_COMPANY}\{YOUR_APP_NAME}\Scripts\python.exe"

Вы также можете рассмотреть свою точку входа, если объявите ее в setup.py.

person Laurent LAPORTE    schedule 15.07.2016

Почему вы усложняете проблему, пытаясь запустить такое задание cron? Просто избавьтесь от хлопот и напишите прямо в crontab с помощью python-crontab:

from crontab import CronTab 
cron = CronTab(user = True) #user='username' to specify a different account

job = cron.new(command='python /home/usr/script/script.py')
job.week.every(1)
job.enable()
if job.is_enabled():
    print 'success!'
person Callam Delaney    schedule 12.07.2016
comment
Документы довольно расплывчаты по этому поводу. См. pypi.python.org/pypi/python-crontab - почему вы бежите WAMP в Windows для производства? - person Callam Delaney; 13.07.2016
comment
Персонал службы поддержки не имеет обучения Linux (смеется), а WAMP - это пакетная версия Windows. - person Busturdust; 13.07.2016
comment
Быстрый взгляд на исходный код показывает, что для него требуется действующая установка cron. работать. Думаю, это означает, что вам нужно что-то вроде cygwin ... - person Peter Brittain; 14.07.2016
comment
Другая возможность - это чистая замена Python для служб планирования ОС apscheduler.readthedocs.io/en/3.0 - person Callam Delaney; 15.07.2016
comment
@ cal97g Но это то, что OP уже использует (завернутый для Flask) и не работает ... - person Peter Brittain; 16.07.2016
comment
python-crontab будет запускаться как процесс в Windows, см. документацию Запуск планировщика, предложения по улучшениям приветствуются. - person Martin Owens -doctormo-; 27.07.2016