rubyをcronで実行するスクリプトで動かすための準備
この記事で書くこと
Rubyを今まで動いてなかった環境で、cronで実行するshell Scriptで呼び出したい時に何が必要だったか忘れないように書いておく。
この記事で書かないこと
どうやってrubyをinstallするか。そしてinstallするまでに躓きがちなエラーなどのケースごとの解決手順。
この記事で書きたいのは、あくまで、cronで実行されるshell scriptでの実行環境を整える部分です。
予めご了承ください。
参考にさせていただいた方々のリンク集 ありがとうございます。
現場のチームメンバーの皆さんにも助けていただきました。
実行環境
$ cat /etc/redhat-release
CentOS release 6.2 (Final)
結論
以下の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
これで、「行けるだろう!」と思っていました。
実行できなかった。
/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を使える状態になったことが確認できました!
最後に
間違ってる箇所などございましたら、コメントにてご指摘いただければ幸いです。
読んでいただきありがとうございました。
Author And Source
この問題について(rubyをcronで実行するスクリプトで動かすための準備), 我々は、より多くの情報をここで見つけました https://qiita.com/xxl/items/88108f9ef70eafab395c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .