Запускаю сбор в полночь, он идёт часов пять. Раз в неделю случается такое: сайт под утро оживает, отклик растёт, прогон не успевает и наезжает на дневной, который стартует в семь. Два прогона мешают друг другу, оба тормозят.
Хочу нормальное окно: старт, предельный срок, поведение при выходе за срок. Как это принято устраивать?
Три вещи: замок, предельный срок и мягкая остановка.
Замок чтобы второй запуск не стартовал поверх первого. Срок чтобы прогон знал, когда пора закругляться. Мягкая остановка чтобы он на этом сроке дописал текущую пачку и вышел сам.
#!/bin/sh
# запуск под замком, предельный срок четыре с половиной часа
flock -n /var/lock/nochnoy.lock \
timeout -s TERM 4.5h /opt/progon/run.sh || echo "занято или вышло время" >&2
Замок снимается сам при выходе, отдельная уборка не нужна.
Оборвёт, если прогон не ловит сигнал. Поэтому ставится обработчик: по TERM выставляем флаг, текущая пачка дописывается, очередь остаётся с непройденными задачами, процесс выходит с кодом.
import signal
pora_zakanchivat = False
def na_signal(nomer, kadr):
global pora_zakanchivat
pora_zakanchivat = True
signal.signal(signal.SIGTERM, na_signal)
while ochered and not pora_zakanchivat:
pachka = ochered.vzyat(200)
obrabotat(pachka)
zapisat(pachka)
```
Недобранное подхватит следующий запуск, потому что задачи из очереди не удалялись до записи.
Добавлю про сам выбор окна, потому что полночь берут по привычке.
Ночь неоднородна. У магазинов с обычной аудиторией провал нагрузки идёт примерно с двух до шести, а до полуночи там ещё живые покупатели и сайт занят ими. Прогон в полночь по такому сайту получает отклик почти дневной и сам себе устраивает те самые пять часов. Сдвиг старта на два часа вперёд иногда сокращает прогон на четверть, ничего больше не трогая.
Как это померить, не гадая. Раз в полчаса сутки подряд дёргайте одну и ту же страницу десятком запросов и пишите медиану отклика в файл. Через сутки у вас картина по часам, и провал видно глазами. Замер стоит копейки, а окно после него выбирается осмысленно.
Второе про окно: не занимайте его целиком. Если сбор влезает в четыре часа, окно берите пять, запас нужен на тот самый плохой день. Прогон, который каждую ночь еле-еле дотягивает до края, ломается при первом же насморке у сайта.
И третье, про наезд на дневной прогон. Даже с замком и сроком стоит развести их по разным очередям и разным лимитам соединений. Тогда пересечение на десять минут никого не убивает.