Управление запуском просроченных задач

Помимо возможности запускать любые задачи в указанное время и с заданной периодичностью, nnCron предоставляет пользователям возможность управлять запуском т. н. просроченных задач и напоминаний. Просроченная задача - это задача, которая должна была выполниться в запланированное время, но этого не произошло, потому что компьютер в этот момент был выключен или nnCron не был загружен.

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

Управлять запуском просроченных задач вы можете с помощью опции RunMissed и переменной nncron.ini DefaultRunMissedTime:.

Продемонстрируем это на примере. Предположим, пользователь еженедельно (по воскресеньям, в 23:30) запускает утилиту cleanup.exe, которая очищает локальные диски от временных файлов. Вот как выглядит эта задача в его кронтабе:

#( test_cleanup
Time: 30 23 * * 7 *
Action:
    START-APP: с:\utils\cleanup.exe
)#

В случае, если в 23:30 ближайшего воскресенья компьютер окажется выключенным, пользователю прийдется ждать следующего запуска целую неделю. Чтобы избежать такого длительного ожидания, пользователь может включить обработку просроченных задач:

#( test_cleanup1
RunMissed
Time: 30 23 * * 7 *
Action:
    START-APP: с:\utils\cleanup.exe
)#

Теперь, если задача не сможет стартовать в ближайшее воскресенье в 23:30, то она запустится "при первой же возможности", когда пользователь в следующий раз включит компьютер, например, в понедельник, в 08:00.

Еще один вариант опции RunMissed - RunMissed: <hh:mm|days> позволяет указывать максимальное время ожидания (в часах и минутах или днях), которое может пройти с момента запланированного, но просроченного старта задачи. Если с момента просроченного старта прошло больше времени, чем установлено пользователем, то внепланового запуска просроченной задачи не произойдет.

Модифицируем задачу из предыдущего примера так, чтобы, будучи просроченной, она запускалась "при первой же возможности", но только если с момента предполагаемого старта прошло не более трех дней:

#( test_cleanup2
RunMissed: 3
Time: 30 23 * * 7 *
Action:
START-APP: с:\utils\cleanup.exe
)#

Теперь, если пользователь выключил компьютер в субботу вечером, а включил в следующий вторник, то задача выполнится сразу после загрузки nnCron, а если бы пользователь включил компьютер, например, в четверг или пятницу, то "внеочередного" запуска просроченной задачи бы не произошло: nnCron стал бы дожидаться следующего воскресенья, поскольку прошло уже больше трех дней с момента последнего предполагаемого старта (прошлое воскресенье, 23:00).

С помощью слова RunMissed? в момент запуска задачи вы можете проверить: является ли ее старт "плановым" или задача была просрочена и теперь выполняется "при первой возможности". Слово RunMissed? удобно использовать для выдачи запроса о целесообразности запуска просроченной задачи.

Управлять запуском просроченных задач (включать/выключать опцию RunMissed и устанавливать максимальное время ожидания) вы можете и из GUI nnCron. Соответствующие чекбоксы и поля ввода есть на диалоговых окнах "Новая задача/Редактировать задачу"

и "Добавить напоминание".


Информация для любознательных: где nnCron хранит информацию, необходимую для корректной обработки просроченных задач?

nnCron хранит информацию, необходимую для корректной обработки просроченных задач, в файле etc\taskinfo.txt. Вот его формат:

Поле Описание
TI-NAME имя задачи
TI-CRC32 crc32 имени+времени
TI-CREATION-TIME время появления crc32
TI-WRITE-TIME пока не используется
TI-EXECUTION-TIME время запуска задачи
TI-FLAG-SUCCESS 1, если задача стартовала успешно
TI-FLAG-EXIST Служебный флаг для удаления устаревших задач. В файле всегда равен 1.


Информация для любознательных: как RunMissed обрабатывает временные диапазоны (скажем, Time: * 16-19 * * * *)?

Сначала вычисляется предыдущее предполагаемое время запуска задачи (отсчёт идёт от текущего времени назад до первой минуты, когда возможен запуск). Если в задаче несколько конструкций Time:, то выбирается временной диапазон с самой большой (ближайшей к текущему времени) правой границей. Если конструкция Time: одна, то выбирается единственный наличествующий временной диапазон. После этого, время предыдущего предполагаемого запуска задачи сравнивается с левой границей выбранного диапазона и, если время запуска окажется меньше этой левой границы, то считается, что время выполнения пропущено и задача запускается как просроченная.

В случае, если задача ещё ни разу не выполнялась, анализируется время создания задачи. Время создания задачи сравнивается с правой границей этого же диапазона. Если время создания окажется меньше правой границы, то тоже считается, что время выполнения пропущено и задача запускается как просроченная.


См. также: