#初めに
railsで定期てきに何かを実行するというのを実装してみる。
自分はWSLを使ってubuntuで行ったが少しつまづいたりしたので最初の設定とかについても書いていく。
#まずcronを使えるようにする。
cronはlinux上で定期実行を実現するために必要なもの(よくわかってない…)
wslのubuntu上では最初はcronは起動していない状態だと思う。
とりあえず今の状況を確認するには
service cron status
で確認できる
cronを起動したい場合は
sudo service cron start
止めたい場合は
sudo service cron stop
でOK
cronが実際に動いているか確認するためにはログを見る
ログの場所は
/var/log/cron.log
だが最初はこのファイルがなくまたcronのログを記録してくれない。
なので
/etc/rsyslog.d/50-default.conf
このファイルを編集します
sudo nano /etc/rsyslog.d/50-default.conf
をして
#cron.* /var/log/cron.log
とコメントアウトされているところの#を削除する。
これで最初の設定はOK
ログを出力したい場合は
tail /var/log/cron.log
でみれる。
ログに関していまいちわからないが 2>>となっているところは何かしらのエラーのログを書いてるとおもわれる
#cronの使い方
crontab -e
でcronの設定を行える
具体的な設定方法については
クーロン(cron)をさわってみるお
https://qiita.com/katsukii/items/d5f90a6e4592d1414f99
を参考に…
#wheneverをつかう
wheneverはrailsでcronを使って定期実行を行う際に使うgem
とりあえず
gem 'whenever'
bundle installをする
そのあと
bundle exec wheneverize
これで/config/schedule.rbというファイルが作成されるのでここに定期実行したいことを書いていく
#schedule.rbのかきかた
いまいちよくわかっていないが
とりあえず
set :environment, "development"
set :output, { :error => "log/cron_error.log" }
set :path, "appへのpath"
をかいておく
log/cron_error.logについてはファイルの作成は自動では行ってくれないのでファイルは自分で作る必要がある
appへのpathについては自分の作っているappのディレクトリでpwdと打てば出てくる
そのあとに何時間ごとに何をするかを書いていく
書き方は
every 1.minutes do
end
=>一分ごとに行う
every 1.hours do
end
=> 一時間ごとに行う
every 1.day, :at => '7:00' do
end
=> 毎日朝の7時に行う
といった感じ
1秒ごとは出来ないっぽい
処理の書き方は
runner "railsでの処理"
command "bashコマンドを行う"
といった感じ
基本的にrunnerを使うことになるのかな?
#毎分userをつくる
例えばuserモデルがあったとして毎分userを作りたいとしたら
every 1.minutes do
runner 'User.create(name: "taro")
end
みたいにしたら毎分userが作れる。
#変更の反映
schedule.rbを変更しただけでは変更は反映されないので
whenever --update-crontab
を行って変更の反映を行う
#wheneverでジョブの実行を行う
wheneverでジョブの実行を行いたい場合は
config/application.rbに
config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.eager_load_paths += Dir["#{config.root}/lib/**/"]
これを書く
そしてlib以下に
usertask.rbというファイルを作り
require 'faker'
require "#{Rails.root}/app/models/user"
class Tasks::Usertask
def self.create
User.create(name: Faker::Name.first_name)
end
end
と書く
schedule.rbに
every 1.minutes do
runner 'Tasks::Usertask.create'
end
みたいに書けばランダムな名前のユーザーが毎分作られるようになる。
#ちなみに
いちおううまくいっているがlog/cron_error.logに
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21328
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21420
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21512
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21604
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21736
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21828
/home/sibakeny/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/spring-2.0.2/lib/spring/application.rb:185: warning: Insecure world writable dir /home/sibakeny/.rbenv/versions in PATH, mode 040777
Running via Spring preloader in process 21920
みたいにエラーがすごいでる。
なんか権限関係の警告みたい…
#終わり
とりあえず定期実行は実装できるようになった。
最初のcronの設定で少しつまづいたけどそれさえ乗り越えたらすごく簡単だった
おわり。
#参考文献
Wheneverを使ってRailsタスクを定期実行する
http://marimomemo.hatenablog.jp/entry/2017/06/25/200415
[ubuntu] cronのログが出力されない時の対処方法
http://blue-bear.jp/kb/ubuntu-cron%E3%81%AE%E3%83%AD%E3%82%B0%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95/