【问题标题】:Requiring a Ruby Gem in Ruby Script breaks Cron Job Execution在 Ruby 脚本中要求 Ruby Gem 会中断 Cron 作业执行
【发布时间】:2014-01-07 11:36:21
【问题描述】:

我正在尝试使用 Gems 运行 cron 作业。我已经通过 RVM 安装了 ruby​​,当我需要 gem 时,它会破坏 cron 工作。我试过需要两个完全不同的 gem,PG / Pry,当我需要任何一个时,cronjob 都没有完成。这是运行良好的“测试代码”:

open('/home/log.log', 'a') do |f|
  f.puts Time.now.to_s
end

这是我设置 cronjob 的方法:

* * * * * /usr/local/rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/test1.rb

我每分钟都能看到新的输出。当我在顶部添加一个 require gem 行时,它会中断,但仅在通过 cron 运行时:

require 'pg'

open('/home/log.log', 'a') do |f|
  f.puts Time.now.to_s
end

cronjob 运行(我可以在 sys 日志中看到它执行),但从未完成(没有输出将其放入文本文件)。我已经在两台不同的服务器上试过这个,一台是 Debian,一台是 CentOS,它们都有同样的问题。奇怪的是,这只会影响 cron 作业,如果我从控制台运行相同的 ruby​​ 文件:/home/test1.rb 它将正常工作。

任何帮助都会很棒。

【问题讨论】:

  • 您有RUBYLIB 环境变量问题吗?运行 cron 作业时的各种搜索路径很少与交互式 shell 中使用的搜索路径相匹配。
  • 我认为我的任何配置中都没有设置 RUBYLIB 环境变量。我做了以下检查。 ruby -e "puts $:" 在 IRB 中,然后我创建了一个 ruby​​ 脚本,它将输出保存到一个文件并通过 cron 作业运行它。两者的输出完全相同。这意味着 Rubylib 环境变量应该不是问题,对吧?
  • @muistooshort - 如果我需要“pry”而不是“pg”,我检查了它是否会损坏,果然如此。因此,我将稍微修改一下问题以反映这一点。
  • 所以不管你require是什么,它都会中断?这闻起来像是某种路径问题。当您在普通的 shell 中运行时,看起来您正在通过 RVM,因此它可能正在为您设置环境。
  • 非常感谢您的帮助。我会在早上尝试这第一件事(这里是凌晨 5 点)。

标签: ruby rubygems cron rvm


【解决方案1】:

您需要使用 rvm 设置您的 crontab,例如:

rvm cron 设置

使用 rvm 在 crontab 文件中设置环境变量

那么你有一个顶部有这个的 crontab 文件:

PATH="/usr/local/rvm/gems/ruby-1.9.3-p194/bin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p194/bin:/usr/local/rvm/bin:/usr/local/rvm/gems/ruby-1.9.3-p194/bin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p194/bin:/usr/local/rvm/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/rvm/gems/ruby-1.9.3-p194@global/"
rvm_env_string='ruby-1.9.3-p194'
rvm_path='/usr/local/rvm'
rvm_ruby_string='ruby-1.9.3-p194'
RUBY_VERSION='ruby-1.9.3-p194'
GEM_HOME='/usr/local/rvm/gems/ruby-1.9.3-p194'
GEM_PATH='/usr/local/rvm/gems/ruby-1.9.3-p194:/usr/local/rvm/gems/ruby-1.9.3-p194@global'
MY_RUBY_HOME='/usr/local/rvm/rubies/ruby-1.9.3-p194'
IRBRC='/usr/local/rvm/rubies/ruby-1.9.3-p194/.irbrc'

然后你可以把你的 crontask 放在它下面

【讨论】:

  • 只是为了简化答案:在控制台“rvm cron setup”中运行此命令,一切都会神奇地工作!谢谢你:)
  • @newUserNameHere 有人告诉我他的控制台在他运行“rvm cron setup”时冻结,其次我不确定 rvm 是否重新排序了你的 crontab,所以你可能需要查看它以查看它之后的样子,这就是为什么我放了一个帮助模板:-)
  • 啊……我明白了。 +1 了解更多信息。再次感谢您的解决方案,我想弄清楚这一点。
  • 提示:rvm cron setup 对某些人(比如我)来说是失败的,但是您可以通过说出 echo $VARIABLENAME 来获取这些变量的所有值,然后手动将它们输入到 crontab 中。像魅力一样工作!
猜你喜欢
  • 2013-10-11
  • 2015-08-29
  • 2013-02-20
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多