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 中安装 rubygems。这帮助我找到了它。【参考方案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 - 无法构建 gem 本机扩展 - 无法加载此类文件 - mkmf (LoadError)