0

シェル上だと動くのに、cronに登録したら動かない!!!なんでだぁー!!!を解決する為の記事です。

まずは落ち着いてください。
解決いたします。

これ、よく聞くお話なんですよ、実は。
大体はcron上と普段のシェル上で環境変数が違うために起こる問題。

個人のマシン上で適当に動かすようなcronだと

* * * * * bash -lc /home/sachem/hachim.rb

みたいにしてログインシェルを間に噛まして環境変数を上書きして実行することでごまかしたりもできます。
これまた別の依存する箇所を増やすので
個人のマシンかrcファイルがちゃんと管理されているような状況以外ではオススメできません。

なのでcron上で実行される状況とほぼ同じ状況でスクリプトを実行してみます。

cron上では環境変数はほぼ空なので環境変数を空にしてみましょう。

env - /home/sachem/hachim.rb

のようなコマンドを実行することで環境変数が空の状態でスクリプトを実行することが可能です。

しかし、
cron上では実際には環境変数は空ではありません。
crontab上で環境変数を設定している場合も多くあります。

なのでcron上でコマンドが実際に実行される時の環境変数を取得しましょう。

* * * * * env > ~/cron_env

上記の用なcrontabを設定することでcronでの実行時の環境変数が取得できます。
これを利用して

env - `cat ~/cron_env` /some/wonderful/script.rb

といった形で実行することでcron経由で実行した時の環境変数を再現した上でスクリプトを起動できます。
何度も試すときは

env - `cat ~/cron_env` sh

といったコマンドを実行してcronの環境変数だけを設定したシェルを立ち上げると

/home/sachem/hachim.rb

だけで試すことも可能です。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です