3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-11

この記事で書くこと :apple:

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

この記事で書かないこと :cruise_ship:

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

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

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

実行環境 :feet:

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

結論 :camel:

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

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

1. まずはrubyを入れる。

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

$ 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

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

実行できなかった。 :cry:

/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を使える状態になったことが確認できました!

最後に

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

3
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?