Подтвердить что ты не робот

Всякий раз, когда драгоценный камень и планирование работы каждые n мин, начиная со смещения

Для ошеломляющих целей я пытаюсь назначить задания на 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" выглядят ожидающими времени в строковом формате. Является ли вышеприведенное действие действительным или просто происходит, и каждый вариант не поддерживает начальное время.

4b9b3361

Ответ 1

Похоже, у вас есть зависимость между двумя заданиями, поэтому есть два способа, с которыми я могу справиться. Если вы хотите запустить 1,6,11,16 и т.д., Как следует из вашего вопроса, просто используйте синтаксис raw 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

Ответ 2

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

Ответ 3

Да, это должно быть действительно. Посмотрите 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)