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

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

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

## 参考にさせていただいた方々のリンク集 :bow: ありがとうございます。
- [シェルスクリプトからrbenv上のrubyを実行したい | はてなブログ](https://thr3a.hatenablog.com/entry/20180923/1537632009)
- [cronの環境変数について | Qiita](https://qiita.com/positrium/items/a2de9af6c5b4d06b504e)
- [rbenv shell コマンドについて | rbenvのGithub README](https://github.com/rbenv/rbenv#how-rbenv-hooks-into-your-shell)

- [cron の設定ガイド](https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html)

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

## 実行環境 :feet: 
```bash
$ cat /etc/redhat-release
CentOS release 6.2 (Final)
```

## 結論 :camel: 
以下の３つを行う必要があった。

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


### 1. まずはrubyを入れる。
今回は、rbenv経由で導入した。
詳しくは、Githubの[rbenv | README](https://github.com/rbenv/rbenv#basic-github-checkout)を参照ください。 :bow: 

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

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


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

```sh:test_ruby.sh
#!/bin/bash

ruby test.rb
```

実行するcronの設定

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

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

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

```tex:/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はどこにいるのかの確認。

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

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


```sh: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` を確認。

```bash:/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の宣言を追加しました。


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

### 動くかの確認。

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

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

実行後に

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

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


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

## 最後に

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