【问题标题】:Can't get rails rake task to play nice with crontab无法让 rails rake 任务与 crontab 配合使用
【发布时间】:2012-01-27 01:18:27
【问题描述】:

我目前有这个 shell 脚本...

nightly.sh

#!/bin/bash
rvm 1.9.2
cd /home/appname/capistrano/current
RAILS_ENV=production bundle exec rake nightly >> /home/appname/capistrano/shared/log/nightly.log 2>&1

我在这里的 crontab 条目中使用它...crontab -e

42 20 * * * /home/appname/nightly.sh

运行时出现此错误

/home/appname/nightly.sh: line 4: bundle: command not found

我正在使用 RVM

我现在已经根据@KL-7 在我的 crontab 中添加了一些环境变量

SHELL=/bin/bash
HOME=/home/appname
PATH=/home/appname/local/bin:/home/appname/.rvm/gems/ruby-1.9.2-p290/bin:/home/appname/.rvm/gems/ruby-1.9.2-p290@global/bin:/home/appname/.rvm/rubies/ruby-1.9.2-p290/bin:/home/appname/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

现在我得到了这个......

/home/appname/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find bundler
[minitest-1.6.0, rake-0.8.7, rdoc-2.5.8] (Gem::LoadError)
        from /home/appname/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:256:in `to_spec'
        from /home/appname/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/site_ruby/1.9.1/rubygems.rb:1210:in `gem'
        from /home/appname/.rvm/gems/ruby-1.9.2-p290/bin/bundle:18:in `<main>'

【问题讨论】:

  • 您是手动创建此 crontab 条目还是使用任何时间或类似的方式创建此 crontab 条目?
  • @FrederickCheung 是的! 感谢您的提问,可能是重要的部分吧?
  • 你的 Rails 应用有 Rakefile 吗?

标签: ruby ruby-on-rails-3 rake crontab


【解决方案1】:

这可能是因为它引发了错误而您没有捕获它。请尝试以下操作:

01 04 * * * /bin/bash -l -c 'cd /home/appname/capistrano/current && RAILS_ENV=production bundle exec rake nightly' >> /home/appname/capistrano/shared/log/nightly.log 2>&1

【讨论】:

  • 这会做什么?抱歉,尽量不要养成在不理解的情况下复制/粘贴到术语中的习惯。
  • 2&gt;&amp;1 将进程的标准错误重定向到其标准输出。例如,请参阅this 了解更多信息。
  • 第一个重定向是针对 stdout 的;第二个是用于标准错误的。您正在捕获标准输出,但没有捕获标准错误。
  • 如果您可以从命令行运行它而没有错误,请确保您在命令中使用正确的 PATH 变量。理想情况下,创建一个包含所有命令的 shell 脚本,然后从 cron 执行该 shell 脚本。
  • 它可以从命令行工作吗?如果是这样,它也应该在脚本中工作。但是,您需要导出变量,以便子 shell 也可以访问它。有效地为每个变量“导出 PATH=blah:blah”。
【解决方案2】:

似乎cron 找不到您的bundle 可执行文件。您需要找到它(例如,使用which bundle),然后在 crontab 中指定它的完整路径或在 crontab 顶部设置 PATH 环境变量,如下所示:

PATH=/bin:/usr/bin:/path/to/directory/with/bundle/

【讨论】:

  • 好的,但 PATH 环境变量没有任何变化。尝试将路径添加到带有bundle 可执行文件的目录,或者至少在脚本中指定bundle 的完整路径。
  • 按照您的建议再次更新。
【解决方案3】:

这可能会有所帮助: /bin/bash -l -c

阅读: http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production

【讨论】:

    【解决方案4】:

    这是另一个解决方案:

    * * * * * ssh localhost 'your command here...'
    

    这将只是 ssh 到同一主机(它获取正常环境)并发出命令

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2019-05-31
      • 2012-07-31
      • 1970-01-01
      • 2017-07-19
      • 2012-09-02
      相关资源
      最近更新 更多