-1

有没有办法用 ruby​​ 验证 crontab?我见过一些不错的 php 实现。

Crontabs 是相当普遍的知识,所以我会省略细节,虽然我不需要像 reboot 这样的关键字来工作。基本上只是像这样带有逗号和破折号的数字

0 4 25,31 12 2012-2020
  • 接下来的 8 个圣诞节和新年凌晨 4 点
4

3 回答 3

1

阅读Validating Crontab Entries with PHP关于这个问题。这同样适用于红宝石,因为正则表达式是一个限制。

于 2012-10-15T21:10:04.627 回答
0

好吧,这不是最漂亮的,尽管我做了一些可以将其拆分并解析出来的东西。这不会经常被触及,所以我不担心速度,尽管它应该处理任何时候无法处理的所有事情,例如范围和逗号分隔的日期,以及重新启动。

这个怎么运作?

有一个方法调用cron_wrong它只是添加一个基本错误。

我正在使用 2 列,interval并且interval_type. interval_type可以是cron, @reboot, minute, hour, day, month, year. 如果是minute, hour, day, month, or year, 我只是将intervaland传递interval_typewheneverand doing interval.send interval_typeor 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
于 2012-10-16T17:26:04.250 回答
-1

查看这个 ruby​​ gem 来处理你的 cron 查询:

https://github.com/javan/无论何时

这是一个相关的 railscast 插曲:

http://railscasts.com/episodes/164-cron-in-ruby

下面是一个语法示例:

every :day, :at => '12:20am' do
  command "echo 'Hi! Its 12:20 am.'"
end
于 2012-10-15T21:12:46.453 回答