13

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

4

6 回答 6

24

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

rvm cron setup # let RMV do your cron settings

确保在运行此命令之前复制 crontab

于 2014-03-29T20:25:24.770 回答
12

如果您手动运行它并且它可以工作,那么您可能处于与 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是切换shell。您可以随时尝试以下操作:

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

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

于 2012-11-20T14:53:46.603 回答
5

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

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

于 2012-11-19T23:53:12.907 回答
1

在非 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
于 2012-11-19T21:34:05.957 回答
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'
于 2017-10-03T20:58:15.183 回答
0

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

0 12 * * * /bin/bash -l -c 'ruby /Users/simon/Desktop/script.rb'
于 2021-09-17T16:03:55.700 回答