[Server & Network] さくらのレンタルサーバー の crontab で rbenv install した Ruby を利用する方法

以前に別サーバの RVM 環境で設定しましたが、rbenv でセットアップしたのであらためて確認します。

今回もこちらを参考にさせて頂きました。

rbenv は下記の形式でインストールされています。

パスとバージョンを確認する

ruby コマンドを実行するシェルスクリプトを用意します。

~/local/bin/ruby.sh
#!/usr/local/bin/zsh
ruby -v
echo $path

スクリプトを実行します。
パスが読まれていることが分かります。

% local/bin/ruby.sh
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-freebsd9.1]
/home/****/local/bin /home/****/local/rbenv/shims /home/****/local/rbenv/bin /home/****/local/bin /sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /home/****/bin

環境変数を空にした結果と比較します。

% env - local/bin/ruby.sh
ruby 1.8.7 (2012-10-12 patchlevel 371) [amd64-freebsd9]
/bin /usr/bin /usr/ucb /usr/local/bin

crontab 上の環境変数を確認する

crontab 上の環境変数を確認します。
crontab -e でファイルを編集します。
~/cron_env が作成されたら、crontab -r でジョブを削除します。

* * * * * env > ~/cron_env

内容はこうなりました。

~/cron_env
% cat cron_env
LOGNAME=****
PATH=/usr/bin:/bin
PWD=/home/****
USER=****
HOME=/home/****
SHELL=/bin/sh

crontab 上の環境変数を読み込んで、シェルスクリプトを実行します。
パスが上書きされているので、ruby v1.8 すら見つからない事が分かります。

% env - `cat ~/cron_env` local/bin/ruby.sh
local/bin/ruby.sh:3: command not found: ruby
/usr/bin /bin

crontab を設定する

crontab -e で rbenv のパスを加えるとうまく動きそうな気がしますが、効いている気配がありませんので作戦を変えます。
crontab は、シェルスクリプトを呼び出すだけの仕事をします。

* * * * *  $HOME/local/bin/ruby.sh

シェルスクリプト内でフルパスで ruby を呼び出します。

~/local/bin/ruby.sh
#!/usr/local/bin/zsh
$HOME/local/rbenv/versions/2.4.1/bin/ruby -v
echo $path

ちょっとダサいですが無事実行できました。

% env - `cat ~/cron_env` local/bin/ruby.sh
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-freebsd9.1]
/usr/bin /bin