<< 2007/01/ 1 1. Spyc 0.2.5
2. kipmsg だそうで
2 3 1. メールってやっぱめんどくさい
4 1. Diigolet が使えないと困る
5 1. FDclone と Emacs の dired で cp
6 1. getmail + maildrop は確かに便利そう
7 1. 爆弾低気圧直撃食らいました
8 9 1. iPhone かぁ
10 1. VMware を使って内部サーバの仮想化を試みる決意をする
11 1. 仮想マシンのディスクの構成で悩む
12 1. ほぉおおぉお < テキストファイル@POSIX
2. ネットワーク上のマウントポイントの確認方法
13 1. しっぱい
2. 入門段階を済ませてから?
14 15 1. cron + dRuby ってできるかな?
16 1. crontab と dotfile について考える
2. 安パーツで高可用性 PC サーバ
3. フジのデジカメプリントは拡張子 .JPEG を認識しない
17 1. Ruby のモジュールをつらつらと
18 1. pear ってなんでミラーがないの
2. prototype.js 1.5 and prototypejs.org
19 1. crontab コマンドでの設定内容を自動バックアップ
20 1. 正規表現の //、コメントの //
21 1. クーラーをファンレスにしたが効果なかった
2. Frenzy 1.1 は SLAX のようなカスタマイズが可能に?
3. netselect であれこれ
22 1. NHKスペシャル『Google革命の衝撃』
23 1. cron, crontab, and more
24 1. cron ジョブに複雑な条件を与えやすくする
25 26 27 28 1. gem の検索って不便だな
29 1. rote いいかもしんない。
30 1. Web検定のサイトが分からない
31 1. DOS/Windows 領域の mount がめんどくさい
>>
トップ «前の日記(2007-01-23) 最新 次の日記(2007-01-28)» 編集

2007-01-24 [長年日記]

_ cron ジョブに複雑な条件を与えやすくする

つーことで『cron, crontab, and more』でちまちま悩んでいましたが、思いついたのはまた Ruby ですが以下のものです。やってることは簡単で、要は

複雑な条件はお気に入りの言語で記述する

ってことです。そのために

  • 条件の名前と実行するプログラムを与えるだけのスクリプトを用意
  • 条件の名前はそのまま(この場合は Ruby の)実行するメソッド名に該当する
  • cron には(例えば)以下のように書く
complex-cron -c RULE 'program'

という方法にしてみました。以下のスクリプトでは RULE は省略可能で、その場合は `default' を指定したものとみなしています。

※ 比較的最近の Web アプリでよくあるプラグインと基本的には同じアイディア、だと思ってます。

呼び出すメソッド(つまり判定条件)に引き数を与えることはできません。一瞬悩みましたが必要ないだろうと思いますし、引き数を与えられるようにすると実行時のパラメータの与え方が複雑になります。

実行するスクリプト

(例えばcomplex-cron て名前にしておく)

#! /usr/bin/env ruby

require 'optparse'
Version = '0.1'

class ComplexCron
  def initialize
    @condfile     = '/etc/defaults/cronconds'
    @condname     = nil
    @cond_default = 'default'
    @debug        = false

    accept_options()
    @cmd = ARGV.shift
    exam_options()
    exec_indeed()
  end

  def exam_options
    if ( @cmd.nil? )
      raise 'Nothing to do.'
    end

    if ( !File.exist?( @condfile ) )
      raise "File #{@condfile} does not exist."
    else
      load( @condfile, false )
      if ( @condname.nil? )
        @condname = @cond_default
      elsif ( !ComplexCronConds.instance_methods().include?( @condname ) )
        raise "Rule #{@condname} is not defined."
      end
    end
  end

  def exec_indeed
    if ( ComplexCronConds.instance_method( @condname ) )
      if ( @debug )
        puts @cmd
      else
        exec @cmd
      end
    end
  end

  def accept_options
    opt = OptionParser.new()
    opt.on( '-f CONDFILE' ) { |file|
      @condfile = file
    }
    opt.on( '-c CONDNAME' ) { |method|
      @condname = method
    }
    opt.on( '-n', 'dry run' ) { |v|
      @debug = true
    }
    opt.parse!( ARGV )
  end
end # of class ComplexCron

ComplexCron.new()

設定ファイルとは名ばかりの Ruby スクリプト

例えば /etc/defaults/cronconds とかいう名前で置いておく。場所はシステムに応じて適当に決めて。

# -*- ruby -*-

module ComplexCronConds
  def default
    return false
  end
end

この中に上で RULE と書いた名前に該当するメソッドを定義していきます。内容はどうぞご自由に。ただしあくまで「条件」をメソッドとして書くので、必ず true か false を返してください。default はあった方がいいかなと思って定義してあるんですけど、実際どう使うのかはあんまりイメージできてません。

これでまぁ、第3水曜だのシステムの負荷の様子だの、Ruby で判別可能な条件はなんでも書けるようになったわけです。あとは必要に迫られたときに考えればいいんじゃないかと。