Cron作业无法加载gem

时间:2012-11-19 21:20:29

标签: ruby ubuntu rubygems cron cron-task

我有一个ruby脚本连接到Amazon S3存储桶并下载最新的生产备份。我已经测试了脚本(非常简单)并且工作正常。

但是,当我将此脚本安排为作为cron作业运行时,它在加载Amazon(aws-s3)gem时似乎失败。

我的脚本的前几行看起来像这样:

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

正如我所说,当我手动运行此脚本时,它工作正常。当我通过计划的cron作业运行它时,它在尝试加载gem时失败:

  

`require':没有要加载的文件 - aws / s3(LoadError)

此脚本的crontab如下所示:

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

我原本以为这可能是因为cron是以不同的用户身份运行的,但是当我在ruby脚本的开头做'whoami'时,它告诉我它是以我一直使用的同一个用户运行。

我还做了一个bundle init并将gem添加到我的gemfile中,但这似乎没有任何影响。

为什么cron无法加载gem?我正在运行Ubuntu。

5 个答案:

答案 0 :(得分:24)

如前所述[{3}},您只需尝试

即可

rvm cron setup # let RMV do your cron settings

确保在运行此命令之前复制crontab

答案 1 :(得分:12)

如果你手动运行它并且它可以工作,你可能在不同的shell环境中,而不是cron正在执行。自从你提到你在Ubuntu上,cron作业可能在/ bin / sh下执行,而你如果你没有改变任何东西,请在/ bin / bash下手动运行它们。

您可以调试环境问题,也可以更改作业运行的shell。

要进行调试,有几种方法可以确定您的cron作业使用的shell。它可以在

中定义
/etc/crontab

或者您可以创建一个cron作业来转储shell和环境信息,如本SO答案中所述:How to simulate the environment cron executes a script with?

要切换到该shell并查看导致作业失败的实际错误,请执行

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'

迫使你的工作陷入困境。这也可能会让事情变得清晰。

答案 2 :(得分:5)

您也可以明确设置Gem路径:

GEM_HOME="/usr/local/rvm/gems/ruby-1.9.2-p290@my-special-gemset"

答案 3 :(得分:1)

在非cron环境中执行echo $PATH,复制路径并将其粘贴到crontab中,然后再执行命令:

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 :(得分:1)

在你的cron开头添加它

PATH="/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4@global/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4@global/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/ruby-2.1.4@global'
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'