rbenvを使ってRubyをinstallした場合、/etc/profileや.bashrc等でrbenvの環境変数を読み込むことでRubyが使えるようになる。普通にログインした場合は.bashrc等が読み込まれるから問題ないが、cronやinitスクリプトでRubyを使う場合は環境変数が読み込まれない。

cronから実行しようとすると、以下の3つの方法がある。

  1. rbenvでinstallしたRubyのフルパスを指定
  2. .bashrc等に書いたことと同じことを書く
  3. bash -lを使ってログインしたのと同じ効果を得る

参考:cronでrbenvのrubyを使う3つの方法

/bin/rubyからrbenvのRubyまでシンボリックリンクを貼ることで、1つ目の方法と実質同じことになるが、cronの記載がシンプルになる。

今回はサーバ用途でRubyのバージョンを固定して使うことを想定し、rbenvをシステムワイドにinstallする。システムワイドでのinstallについてはこちらも参照:rbenvでOSのユーザごとにRubyのversionを分ける

sudo su -
cd /usr/local
git clone git://github.com/sstephenson/rbenv.git

cat <<'EOF' >> /etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
EOF

source /etc/profile

mkdir /usr/local/rbenv/plugins
cd /usr/local/rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git

rbenv install 2.5.1
rbenv global 2.5.1

installした直後、またシェルでログインした場合は、PATHにrbenvのパスが記載されているから、which rubyとするとrbenv内のRubyが表示される。しかしcronから実行するとPATHが/usr/bin:/binになっているためRubyが実行できない。

/bin/rubyからrbenvのRubyまでシンボリックリンクを貼る。

ln -s /usr/local/rbenv/shims/ruby /bin/ruby

これでcronを実行すると、globalのrubyが実行される。

# crontab -l -u user_x
* * * * * (echo $PATH && ruby -v && ruby -r'date' -e 'puts Date.today') > /tmp/ruby.version

$ tail -f /tmp/ruby.version
/usr/bin:/bin
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
2018-06-25