【发布时间】:2012-10-05 21:54:54
【问题描述】:
有没有办法用 ruby 验证 crontab?我见过一些不错的 php 实现。
Crontabs 是相当普遍的知识,所以我会省略细节,虽然我不需要像 reboot 这样的关键字来工作。 基本上只是像这样带有逗号和破折号的数字
0 4 25,31 12 2012-2020
- 接下来的 8 个圣诞节和新年凌晨 4 点
【问题讨论】:
有没有办法用 ruby 验证 crontab?我见过一些不错的 php 实现。
Crontabs 是相当普遍的知识,所以我会省略细节,虽然我不需要像 reboot 这样的关键字来工作。 基本上只是像这样带有逗号和破折号的数字
0 4 25,31 12 2012-2020
【问题讨论】:
阅读Validating Crontab Entries with PHP 了解此问题。这同样适用于 ruby,因为正则表达式是一个限制。
【讨论】:
嗯,它不是最漂亮的,虽然我做了一些东西可以将它拆分并解析出来。这不会经常被触及,所以我不担心速度,尽管它应该处理任何时候无法处理的所有事情,例如范围和逗号分隔的日期,以及重新启动。
它是如何工作的?
有一个名为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 或使用@98765441@3
棘手的部分是 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 查询:
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
【讨论】: