Cron 作业无法加载 gem



我有一个ruby脚本,它连接到AmazonS3存储桶并下载最新的生产备份。我已经测试了这个脚本(非常简单),它运行得很好。

然而,当我计划将此脚本作为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。

如前所述https://coderwall.com/p/vhv8aw你可以简单地尝试

rvm cron setup # let RMV do your cron settings

在运行此命令之前,请确保您制作了crontab的副本

如果你手动运行它并且它有效,你可能在一个与cron不同的shell环境中执行。由于你提到你在Ubuntu上,cron作业可能在/bin/sh下执行,如果你没有更改任何内容,你可以在/bin/bash下手动运行它们。

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

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

/etc/crontab

或者,您可以制作一个cron作业来转储您的shell和环境信息,正如在这个SO答案中提到的:如何模拟cron执行脚本的环境?

要切换到那个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'

把你的工作搞砸。这可能也会让事情明朗起来。

您也可以显式设置您的宝石路径:

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

在非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

将其添加到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'

我已经尝试了上面所有的解决方案,在我尝试之前,它们都不起作用;

0 12 * * * /bin/bash -l -c 'ruby /Users/simon/Desktop/script.rb'