CouchDBに添付してあるスクリプトを直接実行する。
http://www.yssk22.info/relax/_design/twitter/_list/timeline/by_date?descending=true&limit=10 のバックアップだけれども、
ということでこんな感じのcronにしてみました。
DB=http://******:*******@localhost:5984/relax TW_PASS=********* PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games # m h dom mon dow command */15 * * * * /usr/bin/curl -X GET ${DB}/_design/twitter/backup.rb | /usr/bin/ruby1.9 - -u yssk22 -p ${TW_PASS} -d ${DB} > /dev/null 2>&1
curl で直接backup.rb を標準入力に書き出して、それをパイプで ruby に渡してあげる。これでOKです。ただし、ファイル分割をする場合はこれだとうまくいかないんじゃ...?
そこで、ruby 自体にも、LoadError起こしたら引数で渡されたDBからもってくるようなロジックを仕込んでおきます。
# backup.rb 抜粋 # open-uri style pass open_dst = "#{dst.scheme}://#{dst.host}:#{dst.port}/#{dst.path}" open_params = {} if dst.user && dst.password open_params["Authorization"] = 'Basic '+[dst.user+':'+dst.password].pack('m') end begin require File.join(File.dirname(__FILE__), "../../tools/_attachments/lib/util") rescue LoadError => e util_path = File.join(open_dst, "_design/tools/lib/util.rb") puts "Loading #{util_path}" open(util_path, open_params) do |f| eval(f.read) end info "The library loading has been done." end
http://user:pass@host:port/ 形式だとopen-uri が動かなかったのが困りものですが。あと、eval は少し危険かも。