Rubyでcrontabを検証する方法はありますか? 私はいくつかのまともなphp実装を見てきました。
Crontab はかなり一般的な知識なので、詳細は割愛しますが、reboot のようなキーワードは機能する必要はありません。基本的にはカンマとダッシュを含む数字だけです
0 4 25,31 12 2012-2020
- 次の 8 つのクリスマスと新年の午前 4 時
この問題については、PHP を使用した Crontab エントリの検証をお読みください。正規表現は制限であるため、同じことがルビーにも当てはまります。
まあ、それは最もきれいではありませんが、それを分割して解析するものを作成しました. これはあまり頻繁に触れることはないので、速度については心配していませんが、範囲やコンマ区切りの日付、再起動など、処理できないものはすべて処理する必要があります。
使い方?
cron_wrong
基本エラーを追加するだけ のメソッドがあります。
私は 2 つの列を使用していinterval
ますinterval_type
。
interval_type
、、、、、、、cron
のいずれかです。@reboot
_ minute
_ 、、、、または_ _ _ _ _ _ _ _hour
day
month
year
minute
hour
day
month
year
interval
interval_type
whenever
interval.send interval_type
@reboot
トリッキーな部分は、それが実際に有効なcron文字列であることを検証していinterval_type
ますcron
def cron_intervals
non_num_at_beg_or_end = /^[^\d]|[^\d]$/
has_non_nums = /[^\d]/
return if interval_type == '@reboot'
if interval_type != 'cron'
has_non_nums.match(interval) { |str| errors.add :interval, "#{str} must be number" }
errors.add :interval, "can't be blank" if interval.length == 0
return
end
cron = interval.split(' ')
if cron.length != 5
cron_wrong
errors.add :interval, 'Wrong number of arguments supplied, (must be 5 -- minute hour day month year)'
return
end
cron.each do |c|
# return if star or only numbers
if c == '*' || !has_non_nums.match(c)
next
end
non_num_at_beg_or_end.match(c) do |str|
cron_wrong
errors.add :interval, "Non-number '#{str}' found"
return
end
c.split(',').each do |spl_dash|
non_num_at_beg_or_end.match(spl_dash) do |str|
cron_wrong
errors.add :interval, "Non-number '#{str}' found"
return
end
range = spl_dash.split('-')
if range.length < 1 || range.length > 2
cron_wrong
errors.add :interval, "ranges must be between two numbers"
return
elsif range.length == 2 and not (range[0].to_i < range[1].to_i)
cron_wrong
errors.add :interval, "range numbers must be lower-higher"
return
end
range.each do |num|
# should be only numbers at this point
has_non_nums.match(num) do |str|
cron_wrong
errors.add :interval, "Non-number '#{str}' found"
return
end
if num.length.blank?
cron_wrong
errors.add :interval, "No number supplied"
end
end
end
end
end
cron クエリを処理するには、この ruby gem を確認してください。
https://github.com/javan/whenever
関連する Railscast のエピソードは次のとおりです。
http://railscasts.com/episodes/164-cron-in-ruby
構文の例を次に示します。
every :day, :at => '12:20am' do
command "echo 'Hi! Its 12:20 am.'"
end