我有一个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。
答案 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'