Whenever: Укажите день на ежемесячных заданиях

Созданный на 18 июн. 2009  ·  13Комментарии  ·  Источник: javan/whenever

Когда я попытался установить время с ежемесячным заданием cron, мне пришлось использовать «1 месяц».
Но это создало cronjob для каждого месяца в сегодняшний день, например.

0 9 18 * * ..... вместо
0 9 1 * * ..... который сработает в первый день месяца ...

Самый полезный комментарий

Если вы не хотите называть полную дату, вы можете попробовать что-то вроде этого:

каждые 1. месяц,: at => "начало месяца в 9 утра"
Это произведет предполагаемое «0 9 1 * *». Это также сделает ваш код немного чище :)

Надеюсь, это поможет.

-AP

Все 13 Комментарий

вы показываете там весь вывод cron? в вашем первом примере цифра 9 в часах и 18 в днях.

 # .---------------- минута (0-59) 
 # | .------------- час (0 - 23)
 # | | .---------- день месяца (1 - 31)
 # | | | .------- месяц (1 - 12) ИЛИ янв, фев, мар, апр ... 
 # | | | | .---- день недели (0-6) (воскресенье = 0 или 7) ИЛИ вс, пн, вт, ср, чт, пт, сб 
 # | | | | |
 # * * * * * команда для выполнения

нет, полный вывод был:

0 9 18 * * command

вы можете вставить свой файл schedule.rb? что-то кажется неправильным.

every 1.month, :at => "9 AM" do
  command "..."
end

Ах, я вижу проблему (кроме меня, у меня нет хороших документов в этой области). Когда вы используете: at с 1.month, день, час и минута извлекаются из времени. Поэтому, когда вы просто используете время вроде 9 утра, предполагается, что день, который вы имеете в виду, сегодня.

Один из способов исправить это - указать полную дату. Я допускаю, что это выглядит некрасиво, но должно работать: каждые 1 месяц,: at => "1 января, 9 утра"

Он проигнорирует "Январь", но это необходимо для успешного синтаксического анализа (всякий раз, когда используется гем Chronic для синтаксического анализа даты и времени).

Надеюсь, это поможет.

в

Если вы не хотите называть полную дату, вы можете попробовать что-то вроде этого:

каждые 1. месяц,: at => "начало месяца в 9 утра"
Это произведет предполагаемое «0 9 1 * *». Это также сделает ваш код немного чище :)

Надеюсь, это поможет.

-AP

Спасибо, Джаван.

Как вы сказали, это не красиво, но работает!

tsommer ... вышеприведенное решение, которое я опубликовал, должно работать. Не уверен, смотрели ли вы на это.

«начало месяца в 9 утра» - вот правила! Благодарю.

Мне нужно выразить это задание cron «0 0 27-31 * *». Возможно ли это с текущим синтаксисом?

Возможно, было бы лучше предоставить другой метод в DSL для передачи заданий cron в обычном синтаксисе cron, например:

 cron "0 0 27-31 * *" сделать
 # ...
 конец

Я согласен, что вариант с исходным синтаксисом был бы неплохим (патчи приветствуются!). А пока вы можете сделать это с помощью Ruby.

every 1.month, :at => (27..31).to_a.map { |d| "12am January #{d}" } do
  command "..."
end

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

 класс Когда :: Выход :: Крон
 CRON_EXP = / [^ \ s] + \ s [^ \ s +] \ s [^ \ s] + \ s [^ \ s] + \ s [^ \ s] + /

 def time_in_cron_syntax
 case @time
 когда CRON_EXP, то @time
 когда Symbol затем parse_symbol
 когда String, то parse_as_string
 иначе parse_time
 конец
 конец
 конец

Тогда я могу:

 каждые '0 0 27-31 * *' делать
 ...
 конец

как я создаю каждые 2 месяца, конец дня (31-е), 11:59 вечера делать cron?
каждые 2 месяца, при 59 11 л * 0

Была ли эта страница полезной?
0 / 5 - 0 рейтинги