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。这也许可以解决问题。
:
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]"
您可以在非cron环境中检查您的宝石之家:'echo $ GEM_HOME' – thiagotonon
如这里https://coderwall.com/p/vhv8aw提到的,你可以简单地尝试
rvm cron setup # let RMV do your cron settings
确保你让你的crontab的副本运行此命令之前
在你的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'
原来我需要在该shell中安装rubygems。这帮助我追踪下来。 –