シェル上だと動くのにcron上だと動かない。
よく聞くお話ですよね。
大体はcron上と普段のシェル上で環境変数が違うために起こる問題です。
そういう時に使えるtipsを共有します。
個人のマシン上で適当に動かすようなcronだと
* * * * * bash -lc /some/wonderful/script.rb
みたいにしてログインシェルを間に噛まして環境変数を上書きして実行することでごまかしたりもできます。
これまた別の依存する箇所を増やすので
個人のマシンかrcファイルがちゃんと管理されているような状況以外ではオススメできません。
なのでcron上で実行される状況とほぼ同じ状況でスクリプトを実行してみましょう。
cron上では環境変数はほぼ空なので環境変数を空にしてみましょう。
env - /some/wonderful/script.rb
のようなコマンドを実行することで環境変数が空の状態でスクリプトを実行することができます。
ですけど、cron上では実際には環境変数は空ではありません。
crontab上で環境変数を設定している場合も多くあります。
なのでcron上でコマンドが実際に実行される時の環境変数を取得しましょう。
* * * * * env > ~/cron_env
上記の用なcrontabを設定することでcronでの実行時の環境変数が取得できます。
これを利用して
env - `cat ~/cron_env` /some/wonderful/script.rb
といった形で実行することでcron経由で実行した時の環境変数を再現した上でスクリプトを起動できます。
何度も試すときは
env - `cat ~/cron_env` sh
といったコマンドを実行してcronの環境変数だけを設定したシェルを立ち上げると
/some/wonderful/script.rb
だけで試すことも出来ます。