Cron作业无法加载宝石

问题描述:

我有一个ruby脚本,连接到Amazon S3存储桶并下载最新的生产备份。我测试了这个脚本(这非常简单)并且工作正常。Cron作业无法加载宝石

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

我的剧本的前几行看起来是这样的:

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

正如我所说的,当我手动运行该脚本,它工作正常。

'需要':当我通过预定的cron作业运行它,它时,它会尝试加载宝石失败没有这样的文件来加载 - AWS/S3(LoadError)

的crontab的这个脚本是这样的:

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

本来我以为这可能是因为cron是运行作为不同的用户,但是当我做一个“WHOAMI”在我的Ruby脚本开始就告诉我,它的运行作为我一直使用的用户。

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

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

在非cron的环境中执行 echo $PATH,复制路径并将其粘贴到你的crontab,命令之前,

如果你正在手动运行它并且它可以工作,那么你可能与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?

切换到该外壳,看看实际错误导致您的作业失败,做

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' 

强制你的工作进入bash。这也许可以解决问题。

+2

原来我需要在该shell中安装rubygems。这帮助我追踪下来。 –

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 

您也可以明确地设定宝石之路:

GEM_HOME="/usr/local/rvm/gems/[email protected]"

+0

您可以在非cron环境中检查您的宝石之家:'echo $ GEM_HOME' – thiagotonon

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

rvm cron setup # let RMV do your cron settings

确保你让你的crontab的副本运行此命令之前

+1

你拯救了我的生命,非常感谢。 – overallduka

+5

Noice。只要确保在删除我的之前备份您的crontab。 – Peleg

+1

谢谢你,只是哭了2个小时。 –

在你的cron的开头添加这

PATH="/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/[email protected]/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/[email protected]' 
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'