QA@IT

crontab でコマンド実行ができず、command not found になるのはなぜ?

7078 PV

現在、Ubuntu上でcrontabを使いRubyのプログラムを走らせようとしています。
しかしcrontabを動かしているユーザは自分が操作して欲しいと期待しているユーザとは違うようで、関連するライブラリを読み込めません。

具体的にソースで説明させていただきます。

crontab -u username -l
(usernameが今回実行したいユーザ名です)

*/10 * * * * ruby hogehoge.rb

結果

ruby: command not found

通常時のユーザでログインしているときは、Rubyにパスが通っています。
フルパスでRubyコマンドを記述すれば動作するのですが、hogehoge.rbの中で色々関連するライブラリを読んでおり、これらもすべてnot foundになってしまいすべてをフルパスで記述するのは難しい状態です。
ほかにもbashrcを読み込ませようとしたのですがいくつかエラーが出てこけてしまいました。

なのでなんとかcrontabを特定のユーザで実行させることはできないでしょうか?

回答

ログインした時と cron から実行した時では環境変数が異なります。
PATH 変数も /usr/bin:/bin くらいの最低限のものになってしまっているので、ruby を見つけられないのでしょう。

ruby をフルパスで指定して実行してもライブラリが見つからないということは PATH 以外にも必要な環境変数が足りてない可能性があります。

crontab で次のように記述すれば環境変数も設定できるので、必要な環境変数を設定するのが良いと思います。

PATH=/usr/bin:/bin:/xxxxxx
HOGE=hoge

*/10 * * * * ruby hogehoge.rb
編集 履歴 (0)
  • なるほど、ユーザを変えるではなくPATHを通すという考え方があっていたんですね。GEM_HOMEとPATHを正常に動くものにあわせたら動くようになりました。ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。