スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

whenever を使って Rails で cron 的な

Railsでcronのようなバッチ処理を行うためにwheneverを使ってみます。Railsのバージョンは3.2.0。

【1】バッチファイル作成

Railsではバッチファイルなどのプログラムはlib配下に置きます。

とりあえず、バッチファイルを作成。

$ nano lib/tasks/hoge.rb

このファイルにテスト用のプログラムを書いておきます。

class Hoge
 def self.test
  print "This is test!\n"
 end
end




【2】libディレクトリのファイルをオートロードするように設定

lib以下のファイルをオートロードするようにconfig/application.rbを設定します。Applicationクラスの中に次の記述を追記します。

module Hogehoge
 class Application < Rails::Application

  (中略)

  # Custom directories with classes and modules you want to be autoloadable.
  # config.autoload_paths += %W(#{config.root}/extras)
  config.autoload_paths += %W(#{config.root}/lib)
  config.autoload_paths += Dir["#{config.root}/lib/**/"]

  (中略)

 end
end

追記後、次のコマンドが通ってバッチファイルに記述したテキストが表示されれば問題なく設定できています。

$ rails runner Hoge.test
 # => This is test!




【3】wheneverの設定

Gemfileに以下の行を追記。

gem 'whenever', :require => false

そして、次のコマンドを実行。

$ bundle install
$ wheneverize .

wheneverの設定ファイルであるconfig/schedule.rbが作成されます。ピリオドを落とさないように注意。
続いて、生成されたconfig/schedule.rbを編集。

set :environment, :development
set :output, { :error => 'log/error.log', :standard => 'log/cron.log' }

every 1.minutes do
 runner "Sync.test"
end

設定内容を確かめるために

$ whenever

すると、設定されるcronが表示されます。
この時点ではcrontabに設定が反映されていないので、設定内容を確認して

$ xhenever --update-crontab

で反映します。
ちなみに、

$ xhenever --clear-crontab

でwheneverによる設定内容の取り消しができます。

これでwheneverによるcronの設定は完了です――が、ここでエラー発生。

正常に動作すれば、バッチ処理により、log/cron.logに「This is test!」と出力されるはずなのですが、出力が一切ない。
というわけで、エラーの出力先であるlog/error.logを見てみると

could not find bcrypt-ruby-3.0.1 in any sources (BundlerGemNotfound)

とか書かれている。

Gemfileをチェックしたところ、「gem 'bcrypt-ruby'」は書かれていたので、bundle installするが、既にインストール済み。

wheneverによってcrontabに設定されてたコマンド

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

を直接実行してみたところ、次のようなエラーを頂く。

Could not find bcrypt-ruby-3.0.1 in any of the sources
Run `bundle install` to install missing gems.


よくわからないが、Bundler的にはbcrypt-rubyが入っているのに、Ruby的にはそれを認識してないってこと?

Ruby及びRailsはRVM上で動かしているため、とりあえず、

$ rvm all do gem install bcrypt-ruby -v "3.0.1"

して、RVMのgemを読み直すためにターミナルを再起動して、再び

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

を実行したみたところ、エラーメッセージが

Could not find chronic-0.6.7 in any of the sources
Run `bundle install` to install missing gems.

に変化した。同様に

$ rvm all do gem install chronic --version "0.6.7"

して入れてみると、また別のgemが無いとか言われる。

しばらく

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'
$ rvm all do gem install hogehoge --version "0.0.0"
$ exit

を繰り返すも、一向に終わる気配なし。

遅々として進まない状況に嫌気が差して、ダメ元でbundle installしてみたところ、いくつかのgemがインストールされた。

「初めにbundle installしたときには何も起こらなかったのに、なんだよおい、ぶつぶつ……」などと思いながら

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

してみると、エラーを吐かれない。
しばらく放置してcronの動作も確認してみるが、やはりエラーは吐かれない。

原因がわからなくて超気持ち悪いんですが、とりあえず動いたので良しとしておきます。
超気持ち悪いけど!


《参考サイト》
https://github.com/javan/whenever
http://www.slowlydays.net/wordpress/?p=707
スポンサーサイト

Ubuntu cron crontab シェルスクリプト 設定

Ubuntu 12.04でのcrontabの設定方法メモ。


【1】cronの設定

cronの設定には

$ crontab -e

または

$ sudo crontab -e

を使う。

crontabコマンドは実行したユーザーのcrontabを編集するので、シェルをroot権限で実行したい場合、sudo crontabでrootのcrontabを編集する必要がある。


【2】設定内容の確認

設定したcrontabの内容は、crontab -l で確認できる。sudo crontab -e した場合は sudo crontab -l。

また、ログは /var/log/syslog に吐き出されているため、実行されているかどうかを確認するためには、

$ tail /var/log/syslog

すれば良い。


【3】シェルスクリプトに関する注意点

ここでハマった。

crontabを設定し、上記【2】のsyslogを確認した結果、cronが実行されていることは確認できたが、シェルスクリプトによるファイルが生成されなかった。

問題を切り分けるために、ターミナルからシェルスクリプトを直接実行してみたところ、正常に実行できた。

この場合、シェルスクリプトが正常に実行できない理由はいくつか考えられる。

・設定したcrontabのユーザーに実行権限がない。
 →ls -lでパーミッションを確認し、必要に応じてchmodで実行権限を付与。

・crontabの設定時にコマンドの末尾に出力先を書いていないためにエラーを吐かれる。
 →コマンドの末尾に「> /dev/null 2>&1」を追記して出力を捨てるかファイルに出力するように設定する。

・シェルスクリプト実行時のカレントディレクトリが想定と異なる。
 →シェルスクリプトの冒頭付近に「cd /hoge/hoge」を絶対パスで書き込んでカレントディレクトリを設定する。

今回、ハマった理由は3つめのカレントディレクトリの設定でした。


【4】まとめ

問題の切り分け方としてはこんな感じでしょうか。

・ls -lでパーミッションをチェック。
 →必要に応じて実行権限を付与。

・syslogにcronの実行ログが吐かれない。
 →crontabの設定。

・syslogにログは吐かれるが上手く実行されない。
 →crontabのコマンド実行結果の出力先を指定する。

・シェルスクリプトは実行されているはずなのにファイルが出力されない。
 →カレントディレクトリの設定を疑って、シェルスクリプトにpwdコマンドやcdコマンドを書き込んでみる。

DAAPサーバーのインストール

せっかくファイルサーバーを立てたので、音楽データもそこに置けるように、UbuntuでDAAPサーバーを立てます。

とりあえず、forked-daapd を入れます。

$ sudo apt-get install forked-daapd


共有用ディレクトリを作って、パーミッションを777にします。

$ mkdir mydir
$ chmod 777 mydir


forked-daapd の設定ファイルをいじります。

$ sudo nano /etc/forked-daapd.conf


/etc/forked-daapd.conf

directories = { "/mydirpath/mydir" }



あとは、サービスを起動するだけです。

$ sudo /etc/init.d/forked-daapd start



【注意】
 クライアント側からDAAPで接続した時に曲は表示されるのに、再生が行えないときは共有ディレクトリ以下共有ファイルまでのパーミッションをチェックしてみてください。

$ sudo chmod -R 777 mydir

すると、再生できるようになります。
カレンダー
07 | 2012/08 | 09
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
検索フォーム
カテゴリ
月別アーカイブ
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QR
リンク
アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。