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