Cron 作业无法加载 gem

Posted

技术标签:

【中文标题】Cron 作业无法加载 gem【英文标题】:Cron job can't load gem 【发布时间】:2012-11-07 21:14:48 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这里提到https://coderwall.com/p/vhv8aw你可以简单地尝试

rvm cron setup # let RMV do your cron settings

确保在运行此命令之前制作 crontab 副本

【讨论】:

请注意。只要确保在删除我的 crontab 之前备份你的 crontab。 谢谢你,刚刚哭了2个小时。【参考方案2】:

如果您手动运行它并且它工作正常,那么您可能处于与执行 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?

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

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

然后运行您的脚本,您应该会看到错误是什么并能够修复它们(rubygems?)。

选项 2 是切换 shell。您可以随时尝试:

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

强迫你的工作变成 bash。这也可能使事情变得清晰。

【讨论】:

原来我需要在那个 shell 中安装 ruby​​gems。这帮助我找到了它。【参考方案3】:

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

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

【讨论】:

您可以在非 cron 环境中检查您的 gem home:echo $GEM_HOME【参考方案4】:

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

【讨论】:

【参考方案5】:

在你的 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'

【讨论】:

这个超级依赖ruby版本和机器环境。会改用@Michael 的解决方案。【参考方案6】:

我已经尝试了上述所有解决方案,但在我尝试之前它们都没有工作;

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

【讨论】:

以上是关于Cron 作业无法加载 gem的主要内容,如果未能解决你的问题,请参考以下文章

每当 Gem 的 Cron 作业在亚马逊弹性豆茎中失败

无法从 cron 作业中找到 dotenv 环境变量

无法安装 gem - 无法构建 gem 本机扩展 - 无法加载此类文件 - mkmf (LoadError)

LoadError:无法加载“听”gem(Rails 5)

Ruby 雾 gem 导致服务器无法运行:无法加载此类文件 -- xmlrpc/client (LoadError)

乘客:无法加载此类文件 ruby​​gems/builder