Запускайте CronExpression между определенным временем (но не в час)

199
elspoono

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

Есть ли способ настроить CronExpression для запуска, скажем, каждые 5 минут каждого дня между 7:37 AM и 9:13 PM? Настройка для 7 утра - 9 вечера проста. Но я не могу понять, есть ли способ (возможно, он даже не поддерживается) работать по более детальному расписанию.

У меня есть приложение, которое позволяет пользователям указывать собственные графики. Прямо сейчас я округляю вверх / вниз до ближайшего «целого часа», так как не могу понять, как делать определенное время.

Так, например, это работает

0 0/5 2-16? * 1-7 // выполняется каждые 5 минут с 2:00 до 16:00 каждый день недели

Итак, каким будет выражение, если я хочу запустить:

каждые 5 минут с 2:19 до 16:13?

Или это просто невозможно (не считая создания нескольких CronExpressions и превращения их в беспорядочный imo)

Любая помощь, с благодарностью!

1

1 ответ на вопрос

0
AFH

Если вы введете, man 5 crontabвы увидите следующий пример:

 # Run on every second Saturday of the month 0 4 8-14 * * test $(date +\%u) -eq 6 && echo "2nd Saturday" 

Применяя это к вашему делу: -

 0 0/5 2-16 ? * 1-7 test $(date +\%R) \> 02:19 -a $(date +\%R) \< 16:13 && YourCommand 

В качестве альтернативы, если YourCommandэто скрипт, вы можете включить в него временные тесты.

Обратите внимание, что поскольку команда вызывается с кратностью 5 минут после часа, тесты для >и >=эквивалентны (аналогично <и <=); в противном случае вам может потребоваться настроить границы теста (например >= 02:18), поскольку testне поддерживает >=и <=при сравнении строк.

Спасибо за ваш подробный ответ. Я, наверное, должен был упомянуть, что я делаю это на Java. Поэтому я использую класс TriggerBuilder, который принимает объект org.quartz.CronScheduleBuilder (который я передаю в своем «CronExpression»). Таким образом, формат примера, который вы мне прислали, неверен. У меня есть 3-4 дня для работы с этим форматом CronExpression, я никогда не слышал об этом раньше: D Какие-нибудь советы по преобразованию вашего примера выше в Java? Мне интересно, должен ли я следить за временным окном за пределами триггера ... и просто не создавать его до времени начала ... и затем удалять его после? elspoono 6 лет назад 0
хм ... возможно, нашел решение, которое я ищу в Java. elspoono 6 лет назад 0
В `cron` командная строка запланирована с помощью команды оболочки, такой как` bash -c 'test $ (date + \% R) \> 02:19 -a $ (date + \% R) \ <16:13 && YourCommand'` (в соответствии с вашей оболочкой по умолчанию), а `YourCommand` - любая команда, распознаваемая оболочкой, включая` java RunString`. AFH 6 лет назад 0