【问题标题】:validating Crontab via regex in ruby通过 ruby​​ 中的正则表达式验证 Crontab
【发布时间】:2012-10-05 21:54:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby regex crontab


    【解决方案1】:

    阅读Validating Crontab Entries with PHP 了解此问题。这同样适用于 ruby​​,因为正则表达式是一个限制。

    【讨论】:

      【解决方案2】:

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

      它是如何工作的?

      有一个名为cron_wrong 的方法只是添加了一个基本错误。

      我正在使用 2 列,intervalinterval_typeinterval_type 可以是 cron@rebootminutehourdaymonthyear。如果是minutehourdaymonthyear,我只是将intervalinterval_type 传递给whenever 并执行interval.send interval_type 或使用@98765441@3

      棘手的部分是 interval_typecron 时 -- 我正在验证它确实是一个有效的 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
      

      【讨论】:

        【解决方案3】:

        查看这个 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
        

        【讨论】:

        • 这个答案与验证 crontab 的问题没有任何关系。他不是想创造它们,而是检查它们。
        • 这会输出 crontabs。由于使用此 gem 编写它们非常容易,因此他可以比较输出以查看是否符合他的预期。
        猜你喜欢
        • 2012-01-08
        • 1970-01-01
        • 2019-05-19
        • 2015-04-20
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 2010-09-27
        相关资源
        最近更新 更多