Whenever: рдорд╛рд╕рд┐рдХ рдиреМрдХрд░рд┐рдпреЛрдВ рдкрд░ рджрд┐рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЬреВрди 2009  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: javan/whenever

рдЬрдм рдореИрдВрдиреЗ рдорд╛рд╕рд┐рдХ рдХреНрд░реЛрдирдЬреЙрдм рдХреЗ рд╕рд╛рде рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рддреЛ рдореБрдЭреЗ '1.month' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдЖрдЬ рдХреЗ рджрд┐рди рд╣рд░ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЛрдирдЬреЙрдм рдмрдирд╛рдпрд╛, рдЙрджрд╛ред

0 9 18 * *..... рдХреЗ рдмрдЬрд╛рдп
0 9 1* *..... рдЬреЛ рдорд╣реАрдиреЗ рдХреЗ рдкрд╣рд▓реЗ рджрд┐рди рдЖрдЧ рд▓рдЧреЗрдЧреА...

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрдЧрд░ рдЖрдк рдкреВрд░реА рддрд╛рд░реАрдЦ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рд╣рд░ 1.рдорд╛рд╣, :at => "рдорд╣реАрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рд╕реБрдмрд╣ 9 рдмрдЬреЗ"
рдпрд╣ рдЗрдЪреНрдЫрд┐рдд "0 9 1 * *" рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛рдл рднреА рд░рдЦреЗрдЧрд╛ :)

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗред

-рдПрдкреА

рд╕рднреА 13 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ рдЖрдк рд╡рд╣рд╛рдВ рд╕рднреА рдХреНрд░реЙрди рдЖрдЙрдЯрдкреБрдЯ рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ? рдЖрдкрдХреЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдШрдВрдЯреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░ 9 рдФрд░ рджрд┐рди рдореЗрдВ 18 рд╣реИред

 # .---------------- рдорд┐рдирдЯ (0 - 59) 
 # | .--------------- рдШрдВрдЯрд╛ (0 - 23)
 # | | .---------- рдорд╣реАрдиреЗ рдХрд╛ рджрд┐рди (1 - 31)
 # | | | .---------- рдорд╛рд╣ (1-12) рдпрд╛ рдЬрдирд╡рд░реА,рдлрд░рд╡рд░реА,рдорд╛рд░реНрдЪ,рдЕрдкреНрд░реИрд▓... 
 # | | | | .---- рд╕рдкреНрддрд╛рд╣ рдХрд╛ рджрд┐рди (0 - 6) (рд░рд╡рд┐рд╡рд╛рд░ = 0 рдпрд╛ 7) рдпрд╛ рд╕реВрд░реНрдп, рд╕реЛрдо, рдордВрдЧрд▓, рдмреБрдз, рдЧреБрд░реБ, рд╢реБрдХреНрд░, рд╢рдирд┐ 
 # | | | | |
 # * * * * * рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдирд╣реАрдВ, рдкреВрд░рд╛ рдЖрдЙрдЯрдкреБрдЯ рдерд╛:

0 9 18 * * command

рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рд╢реЗрдбреНрдпреВрд▓.рдЖрд░рдмреА рдлрд╛рдЗрд▓ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреБрдЫ рдмрдВрдж рд▓рдЧрддрд╛ рд╣реИред

every 1.month, :at => "9 AM" do
  command "..."
end

рдЖрд╣, рдореБрдЭреЗ рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ (рдореЗрд░реЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдЪреНрдЫреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ)ред рдЬрдм рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ : at 1.month рдХреЗ рд╕рд╛рде, рджрд┐рди, рдШрдВрдЯрд╛ рдФрд░ рдорд┐рдирдЯ рд╕рдордп рд╕реЗ рдкрд╛рд░реНрд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рд╕реБрдмрд╣ 9 рдмрдЬреЗ рдЬреИрд╕реЗ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рдЖрдЬ рдХрд╛ рджрд┐рди рд╣реИред

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреВрд░реА рддрд╛рд░реАрдЦ рджреЗрдВред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмрджрд╕реВрд░рдд рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рд╣рд░ 1.рдорд╛рд╣, :at => "рдЬрдирд╡рд░реА 1st 9am"

рдпрд╣ "рдЬрдирд╡рд░реА" рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдлрд▓ рдкрд╛рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЬрдм рднреА рддрд╛рд░реАрдЦ рдФрд░ рд╕рдордп рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрдирд┐рдХ рд░рддреНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗред

NS

рдЕрдЧрд░ рдЖрдк рдкреВрд░реА рддрд╛рд░реАрдЦ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рд╣рд░ 1.рдорд╛рд╣, :at => "рдорд╣реАрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рд╕реБрдмрд╣ 9 рдмрдЬреЗ"
рдпрд╣ рдЗрдЪреНрдЫрд┐рдд "0 9 1 * *" рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛рдл рднреА рд░рдЦреЗрдЧрд╛ :)

рдЙрдореНрдореАрдж рд╣реИ рдХреА рд╡реЛ рдорджрдж рдХрд░рджреЗред

-рдПрдкреА

рдзрдиреНрдпрд╡рд╛рдж рдЬрд╛рд╡рдиред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛, рдпрд╣ рджрд┐рдЦрдиреЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

tsommer ... рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛ рд╣реИред

"рдорд╣реАрдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рд╕реБрдмрд╣ 9 рдмрдЬреЗ" - рд╡рд╣ рдирд┐рдпрдо! рдзрдиреНрдпрд╡рд╛рджред

рдореБрдЭреЗ рдпрд╣ рдХреНрд░реЙрди рдЬреЙрдм "0 0 27-31 * *" рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИ?

рд╕рд╛рдорд╛рдиреНрдп рдХреНрд░реЙрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдХреНрд░реЙрди рдиреМрдХрд░рд┐рдпреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдПрд╕рдПрд▓ рдореЗрдВ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХреБрдЫ:

 рдХреНрд░реЛрди "0 0 27-31 * *" do
 #...
 рд╕рдорд╛рдкреНрдд

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдПрдХ рдХрдЪреНрдЪрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ (рдкреИрдЪ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!) рдЗрд╕ рдмреАрдЪ рдЖрдк рдЗрд╕реЗ рд░реВрдмреА рдХреЗ рдбреИрд╢ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

every 1.month, :at => (27..31).to_a.map { |d| "12am January #{d}" } do
  command "..."
end

рддреЗрдЬреА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рди рдзрдиреНрдпрд╡рд╛рджред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдЧреЗрдХреНрд╕рдкреА рдХреЛ рдХреБрдЫ рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

 рдХрдХреНрд╖рд╛ рдЬрдм рднреА::рдЖрдЙрдЯрдкреБрдЯ::рдХреНрд░реЛрди
 CRON_EXP = /[^\s]+\s[^\s+]\s[^\s]+\s[^\s]+\s[^\s]+/

 def time_in_cron_syntax
 рдорд╛рдорд▓рд╛ @ рд╕рдордп
 рдЬрдм CRON_EXP рддрдм @time
 рдЬрдм рдкреНрд░рддреАрдХ рддрдм parse_symbol
 рдЬрдм рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрдм parse_as_string
 рдЕрдиреНрдп рдкрд╛рд░реНрд╕_рдЯрд╛рдЗрдо
 рд╕рдорд╛рдкреНрдд
 рд╕рдорд╛рдкреНрдд
 рд╕рдорд╛рдкреНрдд

рддрдм рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ:

 рд╣рд░ '0 0 27-31* *' рдХрд░рддреЗ рд╣реИрдВ
 ...
 рд╕рдорд╛рдкреНрдд

рдореИрдВ рд╣рд░ 2 рдорд╣реАрдиреЗ, рджрд┐рди рдХреЗ рдЕрдВрдд (31 рд╡реЗрдВ), 11 59 рдмрдЬреЗ рдХреНрд░реЛрди рдХреИрд╕реЗ рдмрдирд╛рдКрдВ?
рд╣рд░ 2.рдорд╛рд╣, 59 11 рдПрд▓ * 0 . рдкрд░

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

kovalevsky picture kovalevsky  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alitivay picture alitivay  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

THPubs picture THPubs  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tonytonyjan picture tonytonyjan  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chronodm picture chronodm  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ