Cron作业无法加载gem

Jac*_*ius 13 ruby ubuntu cron rubygems cron-task

我有一个ruby脚本连接到Amazon S3存储桶并下载最新的生产备份.我测试了脚本(这很简单),它工作正常.

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

我脚本的前几行看起来像这样:

#!/usr/bin/env ruby
require 'aws/s3'
Run Code Online (Sandbox Code Playgroud)

正如我所说,当我手动运行此脚本时,它工作正常.当我通过计划的cron作业运行它时,它在尝试加载gem时失败:

`require':没有要加载的文件 - aws/s3(LoadError)

此脚本的crontab如下所示:

0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1
Run Code Online (Sandbox Code Playgroud)

我原本以为这可能是因为cron作为一个不同的用户运行,但是当我在我的ruby脚本开始时执行'whoami'时它告诉我它是以我一直使用的同一个用户运行的.

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

为什么cron无法加载gem?我正在运行Ubuntu.

Mic*_*ael 24

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

rvm cron setup # let RMV do your cron settings

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

  • 在降噪.只需确保在删除我的crontab之前备份它. (5认同)

小智 12

如果你手动运行它并且它可以工作,你可能在不同的shell环境中,而不是cron正在执行.由于你提到你在Ubuntu上,cron作业可能在/ bin/sh下执行,而你是手动的如果你没有改变任何东西,在/ bin/bash下运行它们.

您可以调试环境问题,也可以更改作业运行的shell.

要进行调试,有几种方法可以确定您的cron作业使用的shell.它可以在中定义

/etc/crontab
Run Code Online (Sandbox Code Playgroud)

或者你可以创建一个cron作业来转储你的shell和环境信息,正如在这个SO答案中提到的:如何模拟环境cron执行一个脚本?

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

sudo su
env -i <path to shell> (e.g. /bin/sh)
Run Code Online (Sandbox Code Playgroud)

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

选项2是切换外壳.您可以尝试以下方式:

 0 3 * * * /bin/bash -c '~/Downloader/download.rb > ~/Downloader/output.log 2>&1'
Run Code Online (Sandbox Code Playgroud)

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

  • 结果我需要在那个shell中安装rubygems.这有助于我追踪它. (2认同)

Ach*_*les 5

您还可以明确设置Gem路径:

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