-1

Rubyでcrontabを検証する方法はありますか? 私はいくつかのまともなphp実装を見てきました。

Crontab はかなり一般的な知識なので、詳細は割愛しますが、reboot のようなキーワードは機能する必要はありません。基本的にはカンマとダッシュを含む数字だけです

0 4 25,31 12 2012-2020
  • 次の 8 つのクリスマスと新年の午前 4 時
4

3 に答える 3

1

この問題については、PHP を使用した Crontab エントリの検証をお読みください。正規表現は制限であるため、同じことがルビーにも当てはまります。

于 2012-10-15T21:10:04.627 に答える
0

まあ、それは最もきれいではありませんが、それを分割して解析するものを作成しました. これはあまり頻繁に触れることはないので、速度については心配していませんが、範囲やコンマ区切りの日付、再起動など、処理できないものはすべて処理する必要があります。

使い方?

cron_wrong基本エラーを追加するだけ のメソッドがあります。

私は 2 つの列を使用していintervalますinterval_typeinterval_type、、、、、、、cronのいずれかです。@reboot_ minute_ 、、、、または_ _ _ _ _ _ _ _hourdaymonthyearminutehourdaymonthyearintervalinterval_typewheneverinterval.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
于 2012-10-16T17:26:04.250 に答える
-1

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
于 2012-10-15T21:12:46.453 に答える