2013-04-12 2 views
7

で発見されていないシンプルなRubyスクリプト、hello.rb:!ます。#/ usr/bin/envをルビーは、私が持っているのcron

#!/usr/bin/env ruby 
puts 'hello' 

それは、コマンドラインでOK実行されます。しかし

# /usr/local/src/hello/hello.rb 
hello 

、私はcronに入れた場合:

* * * * * /usr/local/src/hello/hello.rb >> /usr/local/src/hello/hello.log 2>&1 

をログファイルにエラーがあります。ただし、コマンドラインでOK

/usr/bin/env: ruby: No such file or directory 
/usr/bin/env: ruby: No such file or directory 
... 
/usr/bin/env: ruby: No such file or directory 

/usr/bin/env ruby実行:

# /usr/bin/env ruby -v 
ruby 1.8.7 (2012-10-12 patchlevel 371) [i686-linux] 

cronためのenvエラーを修正する方法は?

答えて

16

問題は環境が期待どおりでないことです。

あなたはどちらの場合でも、あなたは環境が別のcronのエントリを追加することにより、どのように見えるかを確認するためにテストすることができ、cronのは、ユーザーとして、またはrootとして実行されているかどうかと言うが、しないでください:

* * * * * /usr/bin/env > /path/to/your/home/directory/env.txt 

これを一度実行してから取り出し、ファイルを見てみましょう。

代わりにあなたのコードを実行するためのRubyを見つけようとする/usr/bin/envを使用するのでは、明示的にルビーを定義します。

* * * * * /path/to/the/ruby/you/want /usr/local/src/hello/hello.rb >> /usr/local/src/hello/hello.log 2>&1 

をあなたが使用することによって必要なルビー把握することができます:

which ruby 

代わりあなたの#で/usr/bin/envに頼るのではなく、!あなたのRubyを定義してください。

あなたのコードに/usr/bin/env rubyを使用すると、RVMやrbenvのようなものを使用したり、Rubyのバージョンを切り替えるときに便利です。あなた自身のアカウントのマシン上であろうと、ルートとして実行している本番ホスト上にあろうと、何かを「プロダクション」に入れているときは、それは良い選択ではありません。

LinuxまたはMac OSの場合は、詳細についてはman 5 crontabをお試しください。また、「Where can I set environment variables that crontab will use?」は非常に便利です。

+1

ちょうどあなたが正しく答えた質問。しかし、env変数はあなたのユーザープロファイルではなく、crondから来ます。それがポイントです。 –

+0

私は '/ usr/local/bin/ruby​​ .../hello.rb'を使って終わりました。 – ohho

3

env既存のPATH変数のみを検索します。 crondはユーザー名として実行されるプロセスを作成します。したがって、PATHは最小です。スクリプト自体に環境変数を設定する必要があります

+1

crondは、rootまたはシステム上の任意のユーザーに対してcrontabを実行できます。 –

+0

正解ですが、あなたはあなたと同じようにログインしません。変数はあなたのものではないので、あなたはそれらを継承します。 –

関連する問題