RVM + cron 自動執行說明解釋


#1

這篇其實是給自己的 memo

RVM 要上 cron ( /etc/crontab , Linux 下定時自動執行 ),之前很麻煩,但看了一下 doc 後寫在這邊

Linux 打習慣會類似使用這種東西,類似找到執行檔後直接想辦法弄出來

which ruby #=> /home/user/.rvm/rubies/ruby-2.1.2/bin/ruby
# fail , don't use it

而 RVM 不能這樣搞,因為 env 的差異性很大,而你應該經過一個 wrapper 轉換,而非直接用目前的執行程式來直接執行檔案,而以下是解法,類似先 search rvm 的資料夾

$ ls /home/user/.rvm/wrappers/

default/    ruby-2.1.2/    ruby-2.1.2@global/    ruby-2.1.5/    ruby-2.1.5@global/

看一下你目前的版本,不要用 @global 系列,其實有 irb 可以用,所以可以來做驗證(這邊其實希望找別的使用者,或是乾脆用 root,類似使用 sudo -sH,因為通常 root 都沒有 rvm 的)

$ /home/user/.rvm/wrappers/ruby-2.1.2@global/irb
irb> require 'active_record'
#=> LoadError: cannot load such file -- active_record
irb> exit

$ /home/user/.rvm/wrappers/ruby-2.1.2/irb
irb> require 'active_record'
#=> true

恭喜你找到能用的 Ruby 且經過 irb 的測試可以抓到 gem ,這樣的用法就可以跨到其他使用者且 gemset 都抓好好,再來是修改 crontab

vim /etc/crontab
*/15 * * * * user /home/user/.rvm/wrappers/ruby-2.1.2/ruby /home/user/test.rb

這樣大概就沒問題了,然後要記得檔案讀取的問題,類似教學 cycle 內有教到寫好 .rb 後如何 require lib 和相鄰檔案,類似

#ruby 1.9+
require_relative '../lib/im_lib.rb'
File.open("#{File.dirname(__FILE__)}/../config.yml")

#ruby 2.0+
File.open("#{__dir__}/../config.yml")

所有的檔案記得使用『對象檔案於這行 code 所在的 rb 檔的目錄相對位置』來讀取就是了,hmm大概就這樣而已,以上


Ubuntu上如何用排程執行ruby檔案
Nokogiri 問題求救
Ruby / Rails 武器的選擇
Ubuntu上如何用排程執行ruby檔案
請問passenger+nignx問題
ruby script 在別的資料夾被執行會找不到 gem [LoadError]