有没有办法用 ruby 验证 crontab?我见过一些不错的 php 实现。
Crontabs 是相当普遍的知识,所以我会省略细节,虽然我不需要像 reboot 这样的关键字来工作。基本上只是像这样带有逗号和破折号的数字
0 4 25,31 12 2012-2020
- 接下来的 8 个圣诞节和新年凌晨 4 点
阅读Validating Crontab Entries with PHP关于这个问题。这同样适用于红宝石,因为正则表达式是一个限制。
好吧,这不是最漂亮的,尽管我做了一些可以将其拆分并解析出来的东西。这不会经常被触及,所以我不担心速度,尽管它应该处理任何时候无法处理的所有事情,例如范围和逗号分隔的日期,以及重新启动。
这个怎么运作?
有一个方法调用cron_wrong
它只是添加一个基本错误。
我正在使用 2 列,interval
并且interval_type
.
interval_type
可以是cron
, @reboot
, minute
, hour
, day
, month
, year
. 如果是minute
, hour
, day
, month
, or year
, 我只是将interval
and传递interval_type
给whenever
and doing interval.send interval_type
or using@reboot
棘手的部分是interval_type
-cron
我正在验证它确实是一个有效的 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
查看这个 ruby gem 来处理你的 cron 查询:
这是一个相关的 railscast 插曲:
http://railscasts.com/episodes/164-cron-in-ruby
下面是一个语法示例:
every :day, :at => '12:20am' do
command "echo 'Hi! Its 12:20 am.'"
end