rbenvを使ってRubyをinstallした場合、/etc/profileや.bashrc等でrbenvの環境変数を読み込むことでRubyが使えるようになる。普通にログインした場合は.bashrc等が読み込まれるから問題ないが、cronやinitスクリプトでRubyを使う場合は環境変数が読み込まれない。
cronから実行しようとすると、以下の3つの方法がある。
- rbenvでinstallしたRubyのフルパスを指定
.bashrc
等に書いたことと同じことを書くbash -l
を使ってログインしたのと同じ効果を得る
/bin/ruby
からrbenvのRubyまでシンボリックリンクを貼ることで、1つ目の方法と実質同じことになるが、cronの記載がシンプルになる。
今回はサーバ用途でRubyのバージョンを固定して使うことを想定し、rbenvをシステムワイドにinstallする。
※システムワイドでのinstallについてはこちらも参照:
- rbenvでOSのユーザごとにRubyのversionを分ける
CentOSへのRubyインストールはSoftware Collections(SCL)からのyum installがベスト
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