この記事で書くこと ![:apple: :apple:]()
Rubyを今まで動いてなかった環境で、cronで実行するshell Scriptで呼び出したい時に何が必要だったか忘れないように書いておく。
この記事で書かないこと ![:cruise_ship: :cruise_ship:]()
どうやってrubyをinstallするか。そしてinstallするまでに躓きがちなエラーなどのケースごとの解決手順。
この記事で書きたいのは、あくまで、cronで実行されるshell scriptでの実行環境を整える部分です。
予めご了承ください。 
参考にさせていただいた方々のリンク集
ありがとうございます。
現場のチームメンバーの皆さんにも助けていただきました。 
実行環境 ![:feet: :feet:]()
$ cat /etc/redhat-release
CentOS release 6.2 (Final)結論 ![:camel: :camel:]()
以下の3つを行う必要があった。
- rubyを入れる
- shell script上で、rubyを明示的に読み込む。
- 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が入ったことが確認できました。
実行したかったスクリプトイメージ
#!/bin/bash
ruby test.rb
実行するcronの設定
00 12 *** /bin/bash /home/user_name/test_ruby.sh > /home/user_name/log/test_ruby.log 2>&1
これで、「行けるだろう!」と思っていました。
実行できなかった。 ![:cry: :cry:]()
/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
だったので、スクリプトをいかに修正。
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を確認。
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の宣言を追加しました。
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/user_name/.rbenv/bin
動くかの確認。
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を使える状態になったことが確認できました!
最後に
間違ってる箇所などございましたら、コメントにてご指摘いただければ幸いです。
読んでいただきありがとうございました。 




