【问题标题】:Cron job can't load gemCron 作业无法加载 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。

【问题讨论】:

    标签: ruby ubuntu rubygems cron cron-task


    【解决方案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 中安装 ruby​​gems。这帮助我找到了它。
    【解决方案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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 2019-10-01
        • 2012-10-13
        • 2015-09-20
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多