rubyをcronで実行するスクリプトで動かすための準備


この記事で書くこと

Rubyを今まで動いてなかった環境で、cronで実行するshell Scriptで呼び出したい時に何が必要だったか忘れないように書いておく。

この記事で書かないこと

どうやってrubyをinstallするか。そしてinstallするまでに躓きがちなエラーなどのケースごとの解決手順。
この記事で書きたいのは、あくまで、cronで実行されるshell scriptでの実行環境を整える部分です。
予めご了承ください。

参考にさせていただいた方々のリンク集 ありがとうございます。

現場のチームメンバーの皆さんにも助けていただきました。

実行環境

$ cat /etc/redhat-release
CentOS release 6.2 (Final)

結論

以下の3つを行う必要があった。

  1. rubyを入れる
  2. shell script上で、rubyを明示的に読み込む。
  3. cronでは独自PATHが読み込まれるため、cronにrubyを読み込めるようにpathを通す。

1. まずはrubyを入れる。

今回は、rbenv経由で導入した。
詳しくは、Githubのrbenv | READMEを参照ください。

$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

rubyが入ったことが確認できました。

実行したかったスクリプトイメージ

test_ruby.sh
#!/bin/bash

ruby test.rb

実行するcronの設定

crontab
00 12 * * * /bin/bash /home/user_name/test_ruby.sh > /home/user_name/log/test_ruby.log 2>&1

これで、「行けるだろう!」と思っていました。

実行できなかった。

/home/user_name/log/test_ruby.log
/home/user_name/test_ruby.sh: line 3: ruby: command not found

どうして。。と思いました。
次から対応すべき項目の2と3についてを書きます。

2. shell script上で、rubyを明示的に読み込む。

そもそもrbenvはどこにいるのかの確認。

$ which rbenv
/home/user_name/.rbenv/bin

だったので、スクリプトをいかに修正。

test_ruby.sh
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
rbenv shell 2.7.1
ruby -v

再度実行すると、

$ /bin/bash /home/user_name/test_ruby.sh
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

きた!

ここで先輩エンジニアからの呟きが分報に届きました。

🐈 「cronはPATHが独自だった気がする」

そうです。ただのshellscriptの実行では無く、cron経由での実行なのです。
つまり、旅はまだ途中でした。

3. cronでは独自PATHが読み込まれるため、cronにrubyを読み込めるようにpathを通す。

そもそものPATHがどうなってるのか、 /etc/crontab を確認。

/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

なるほど。確かに、 rbenvへのPATHが登録されてない。

/etc/crontab を変更する方が正しいのか、どうなのかわかりませんでしたが、今回は crontab -e でPATHの宣言を追加しました。

crontab
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/user_name/.rbenv/bin

動くかの確認。

crontab
01 15 * * * /bin/bash /home/user_name/test_ruby.sh > /home/user_name/log/test_ruby.log 2>&1

このようにして、試しにcron経由で実行してみました。

実行後に

$ less /home/user_name/log/test_ruby.log

ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

しっかりとrubyを使える状態になったことが確認できました!

最後に

間違ってる箇所などございましたら、コメントにてご指摘いただければ幸いです。
読んでいただきありがとうございました。