2012-11-19 65 views
12

我有一個ruby腳本,連接到Amazon S3存儲桶並下載最新的生產備份。我測試了這個腳本(這非常簡單)並且工作正常。Cron作業無法加載寶石

但是,當我安排此腳本作爲cron作業運行時,它在加載Amazon(aws-s3)gem時似乎失敗。

我的劇本的前幾行看起來是這樣的:

#!/usr/bin/env ruby 
require 'aws/s3' 

正如我所說的,當我手動運行該腳本,它工作正常。

'需要':當我通過預定的cron作業運行它,它時,它會嘗試加載寶石失敗沒有這樣的文件來加載 - AWS/S3(LoadError)

的crontab的這個腳本是這樣的:

0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1 

本來我以爲這可能是因爲cron是運行作爲不同的用戶,但是當我做一個「WHOAMI」在我的Ruby腳本開始就告訴我,它的運行作爲我一直使用的用戶。

我也做了一個bundle init,並將gem添加到我的gemfile中,但這似乎沒有任何影響。

爲什麼cron無法加載寶石?我正在運行Ubuntu。

在非cron的環境中執行 echo $PATH,複製路徑並將其粘貼到你的crontab,命令之前,

回答

11

如果你正在手動運行它並且它可以工作,那麼你可能與cron執行在不同的shell環境中。既然你提到你在Ubuntu上,那麼cron作業可能在/ bin/sh下執行,而你如果你沒有改變任何東西,請在/ bin/bash下手動運行它們。

您可以調試您的環境問題,也可以更改作業運行的shell。

要進行調試,有幾種方法可以確定您的cron作業正在使用的shell。它可以在

/etc/crontab 

被定義或者你可以做一個cron作業傾倒你的shell和環境的信息,如已在此被提及SO回答:How to simulate the environment cron executes a script with?

切換到該外殼,看看實際錯誤導致您的作業失敗,做

sudo su 
env -i <path to shell> (e.g. /bin/sh) 

然後運行腳本,你應該看到的錯誤是什麼,能夠解決這些問題(RubyGems的?)。

選項2是切換外殼。你總是可以嘗試類似於:

0 3 * * * /bin/bash -c '~/Downloader/download.rb > ~/Downloader/output.log 2>&1' 

強制你的工作進入bash。這也許可以解決問題。

+2

原來我需要在該shell中安裝rubygems。這幫助我追蹤下來。 –

0

echo $PATH 
/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 

和裏面的crontab:

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 
0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1 
4

您也可以明確地設定寶石之路:

GEM_HOME="/usr/local/rvm/gems/[email protected]"

+0

您可以在非cron環境中檢查您的寶石之家:'echo $ GEM_HOME' – thiagotonon

22

如這裏https://coderwall.com/p/vhv8aw提到的,你可以簡單地嘗試

rvm cron setup # let RMV do your cron settings

確保你讓你的crontab的副本運行此命令之前

+1

你拯救了我的生命,非常感謝。 – overallduka

+5

Noice。只要確保在刪除我的之前備份您的crontab。 – Peleg

+1

謝謝你,只是哭了2個小時。 –

1

在你的cron的開頭添加這

PATH="/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/home/user/.rvm/bin:/usr/local/sbin:/usr/sbin:/home/user/.rvm/bin:/home/user/.local/bin:/home/user/bin" 
GEM_HOME='/home/user/.rvm/gems/ruby-2.1.4' 
GEM_PATH='/home/user/.rvm/gems/ruby-2.1.4:/home/user/.rvm/gems/[email protected]' 
MY_RUBY_HOME='/home/user/.rvm/rubies/ruby-2.1.4' 
IRBRC='/home/user/.rvm/rubies/ruby-2.1.4/.irbrc' 
RUBY_VERSION='ruby-2.1.4'