всякий раз, когда драгоценный камень и планирование задания каждые n мин, начиная со смещения - PullRequest
16 голосов
/ 10 июня 2011

В ошеломляющих целях я пытаюсь запланировать задания со смещением в 2 минуты, которое выполняется каждые 5 минут. То есть я хочу, чтобы 1 задание выполнялось 1,6,11,16 .. а другое - 2,7,12,17 ...

Я не смог найти пример для этого. Итак, я попробовал:

every 5.minutes, :at=> 1 do
 command "echo 'you can use raw cron sytax too'"
end 

Кажется, это работает, но все примеры ': at' выглядят ожидающими время в строковом формате. Действительно ли указанное выше допустимо или просто работает, и каждый параметр не поддерживает время запуска.

Ответы [ 3 ]

19 голосов
/ 11 июня 2011

Похоже, у вас есть зависимость между двумя заданиями, поэтому я думаю, что вы можете справиться с этим двумя способами. Если вы хотите работать с 1,6,11,16 и так далее, как подсказывает ваш вопрос, просто используйте необработанный синтаксис cron:

every '0,5,10,15,20,25,30,35,40,45,50,55 * * * *' do
  command "echo 'you can use raw cron syntax one'"
end

every '1,6,11,16,21,26,31,36,41,46,51,56 * * * *' do
  command "echo 'you can use raw cron syntax two'"
end

Но, вероятно, лучше выполнить второе задание, как только первое будет выполнено. Это должно гарантировать, что задания не перекрываются и что вторая выполняется только после завершения первой.

every 5.minutes do
  command "echo 'one' && echo 'two'"
end
8 голосов
/ 21 августа 2014

every ожидает целое число.

Чтобы избежать проблемы с грохотом, вы можете сделать это.

every 5.minutes - 10.seconds do
  command "echo first task"
end

every 5.minutes + 10.seconds do
  command "echo second task"
end

Вы также можете рандомизировать смещение

def some_seconds
  (-10..10).to_a.sample.seconds
end

every 5.minutes + some_seconds do
  command "echo first task"
end

every 5.minutes + some_seconds do
  command "echo second task"
end

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

# shedule.rb
every 5.minutes do
  rake 'jobs:last_one'
end

# Rakefile.rb
namespace :jobs do
  task :first_one do
    sh 'first command'
  end

  task second_one: [:first_one] do
    sh 'second_command that_should_run_after_first_one'
  end

  task last_one: [:second_one] do
    sh 'last_command that_should_run_after_all_commands'
  end
end
2 голосов
/ 05 октября 2013

Да, это должно быть в силе.Посмотрите на https://github.com/javan/whenever/blob/master/lib/whenever/cron.rb

Посмотрите на метод parse_time.В частности, эти строки:

      when 1.hour...1.day
        hour_frequency = (@time / 60 / 60).round
        timing[0] = @at.is_a?(Time) ? @at.min : @at
        timing[1] = comma_separated_timing(hour_frequency, 23)
...