2013-04-12 42 views
7

發現我有一個簡單的Ruby腳本,hello.rb#在/ usr/bin中/ env的紅寶石是不是在cron

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

它運行在命令行中確定:

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

然而,如果我把它放在cron

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

有在日誌文件中的錯誤:

/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] 

如何修復ENV錯誤cron

回答

16

問題是環境不符合您的期望。

你不說的cron是否正在運行爲你的用戶,或以root身份,但是,在這兩種情況下,你可以測試一下,看看環境是什麼樣子,加入的另一cron項:

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

讓它運行一次,然後將其拉出,然後查看文件。

而不是使用/usr/bin/env,試圖找到一個Ruby來運行你的代碼,定義了Ruby明確的:

* * * * * /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的各個版本之間切換。當您將某些內容放入「製作」中時,這不是一個好的選擇,無論它是在您的計算機上以您自己的帳戶登錄還是在以root用戶身份運行的生產主機上。

如果您在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或系統上的任何用戶運行crontabs。 –

+0

正確,但IT不會按照您的身份登錄。所以變量不是你的,你繼承它們。 –