2011-06-10 19 views
13

Para propósitos asombrosos estoy tratando de programar trabajos un desplazamiento de 2 minutos que se ejecutan cada 5 minutos. Es decir, quiero 1 trabajo para ejecutar 1,6,11,16 .. y el otro para ejecutar a 2,7,12,17 ...siempre joya y programar un trabajo cada n min comenzando en un desplazamiento

No pude encontrar un ejemplo para hacer esto. Así que he intentado:

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

Esto parece funcionar, pero todos los ': a' ejemplos parecen estar esperando una hora en un formato de cadena. ¿Es válido lo anterior o simplemente funciona y cada opción realmente no admite una hora de inicio.

Respuesta

18

Parece que tiene una dependencia entre los dos trabajos, por lo que hay dos formas en que creo que puede manejar esto. Si desea ejecutar en 1,6,11,16 y así sucesivamente, como su pregunta sugiere, a continuación, sólo tiene que utilizar la sintaxis cron prima:

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 es mejor para ejecutar el segundo trabajo una vez que la primera es hecho. 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 
+0

Gracias Pan. Sí, vi el soporte de sintaxis de cron en bruto, pero quería evitar escribir toda la cadena y utilizarla siempre para facilitar mi trabajo. Además, no hay dependencia en las tareas y hay más de 2. Solo quiero escalonarlas para que no se ejecuten todas a la misma hora cada hora. – HeretoLearn

+0

@HeretoLearn siempre que no sea compatible con este tipo de sintaxis en ruby ​​puro, por lo que deberá utilizar la sintaxis criptográfica sin procesar. Si los trabajos no son dependientes el uno del otro, recomendaría ejecutarlos usando el primer ejemplo. –

2

Sí, eso debería ser válido. Mire https://github.com/javan/whenever/blob/master/lib/whenever/cron.rb

Mire 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) 
+0

Este código muestra que la opción 'at' solo se usa de 1 hora a 1 día, por lo que lamentablemente NO funcionará. Miré al otro cada vez que aparece el código fuente y parece que el intervalo> 1 h utiliza a, pero en menos de 1 h no lo hace. – TomDavies

6

every esperan un número entero.

Para evitar el problema de la manada de truenos, puede hacerlo.

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

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

Usted puede asignar al azar el desplazamiento demasiado

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 va a funcionar para tareas en función de uno al otro. Si sus tareas dependen entre sí, debe usar 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 
+2

Parece una forma más sensata de resolver el problema que la respuesta aceptada. – Epigene

+0

Esto no funcionó para mí tan intuitivamente como lo había supuesto. 'cada 15.minutos + 2.minutos do' Convertido en esto: ' 17,34,51 * * * * ' lo que estaba buscando era esto: ' 2,17,32,47 * * * * ' Trabajando en Rails 4.2.5 con Whenever gem 0.9.4 – Shadoath

Cuestiones relacionadas