ruby - santa - cada vez que gema y la programación de un trabajo cada n min a partir de un desplazamiento
parroquia santa gema (3)
Parece que tienes una dependencia entre los dos trabajos, así que hay dos formas en que creo que puedes manejar esto. Si desea ejecutar en 1,6,11,16 y así sucesivamente, como lo sugiere su pregunta, simplemente use la sintaxis cron sin procesar:
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
Pero probablemente sea mejor ejecutar el segundo trabajo una vez que termine el primero. Esto debería garantizar que los trabajos no se superpongan y que el segundo solo se ejecute cuando finalice el primero.
every 5.minutes do
command "echo ''one'' && echo ''two''"
end
Para fines asombrosos, estoy tratando de programar trabajos con una compensación de 2 minutos que se ejecutan cada 5 minutos. Es decir, quiero 1 trabajo para ejecutar 1,6,11,16 .. y el otro para correr a 2,7,12,17 ...
No pude encontrar un ejemplo para hacer esto. Así que lo intenté:
every 5.minutes, :at=> 1 do
command "echo ''you can use raw cron sytax too''"
end
Esto parece funcionar, pero todos los ejemplos '': at'' parecen esperar una hora en formato de cadena. ¿Es válido lo anterior o simplemente funciona y cada opción realmente no admite una hora de inicio.
Sí, eso debería ser válido. Mira https://github.com/javan/whenever/blob/master/lib/whenever/cron.rb
Mira el método parse_time. Estas líneas en particular:
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)
every
espera un entero.
Para evitar el problema de la manada, puedes hacer esto.
every 5.minutes - 10.seconds do
command "echo first task"
end
every 5.minutes + 10.seconds do
command "echo second task"
end
También puedes aleatorizar el desplazamiento
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
Al igual que otras respuestas, esto no funcionará para tareas que dependen unas de otras. Si sus tareas dependen unas de otras, debe usar el rake
para manejarlo o ejecutar el siguiente manualmente en su tarea.
# 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