【问题标题】:Rails cron whenever, bundle: command not found每当Rails cron,捆绑:找不到命令
【发布时间】:2012-03-17 22:42:08
【问题描述】:

我正在尝试每天执行一次 rake 任务。我收到此错误

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

这是我的 crontab

# Begin Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb
PATH=/home/af/.rvm/gems/ruby-1.9.2-p180@global/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

0 0 * * * /bin/bash -l -c 'cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1'

# End Whenever generated tasks for: /home/af/www/app/releases/20120216172204/config/schedule.rb

我不知道为什么它不起作用。如果我运行命令:

cd /home/af/www/app/releases/20120216172204 && rvm 1.9.1-p180; RAILS_ENV=production /home/af/.rvm/gems/ruby-1.9.2-p180/bin/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1

它工作正常,不知道这里发生了什么。

【问题讨论】:

  • 如果你没有得到答案,请给我发邮件,我会告诉你什么对我有用。不过,我希望其他人回答这个问题,因为我从不喜欢我的解决方案。
  • 过去几周我一直在尝试解决这个问题。真的不知道是什么原因造成的。你的解决方案是什么?

标签: ruby-on-rails cron whenever


【解决方案1】:

您还可以确保您的 PATH 最终出现在 crontab 中,方法是将以下内容放在 schedule.rb 文件的顶部:

env :PATH, ENV['PATH']

https://groups.google.com/forum/#!msg/whenever-gem/yRLt3f2jrfU/Exu3xfCo8DAJ

如果上述解决方案不适合您,请尝试:

env :GEM_PATH, ENV['GEM_PATH']

【讨论】:

  • 以防万一。这对我有用,但后来找不到我的 gemfile。我用env :GEM_PATH, ENV['GEM_PATH']修复了它
  • 这对我不起作用 - 您可以尝试删除 env :PATH, ENV['PATH'] 并确认这实际上是一个修复程序吗?
  • 这个环境 :GEM_PATH, ENV['GEM_PATH'] 适合我。谢谢
【解决方案2】:

就我而言,我只是跑了:

rvm env --path -- ruby-version[@gemset-name]

参考cron job setup doc

为 ruby​​ 路径的命令添加了新的源代码行 crontab -e 中的 bundle 命令之前

source /usr/local/rvm/environments/ruby-1.9.3-p392;

现在的命令如下:

之前:

0 4 * * * cd /home/current && bundle exec rake my_rake RAILS_ENV=production

之后:

0 4 * * * cd /home/current && source /usr/local/rvm/environments/ruby-1.9.3-p392; bundle exec rake my_rake RAILS_ENV=production

干杯!!!

【讨论】:

    【解决方案3】:

    经过这么多尝试,以下似乎可行

    从终端输入以下内容

    1. 键入 crontab -e 这将打开 crontab 进行编辑。您将看到如下两行:

      # cron clears out environment variables, but Rubber.root/script/rubber uses
      # "rvm do default" to run, so no longer any need to setup ruby env vars here,
      # all we need is PATH
      PATH=/<path to bundle>/bundle/ruby/1.9.1/bin:/usr/local/rvm/gems
      

      # Begin Whenever generated tasks for: /mnt/wamjoke-production/releases/20120912$
      PATH=/<path to bundle>/shared/bundle/ruby/1.9.1/bin:/usr/local/rvm/gems
      
    2. 注释掉以 PATH 开头的两行。

    每当您运行“bundle execwhen”命令时,请执行上述步骤。它有效。

    不知道为什么 PATH 会误导环境。

    【讨论】:

      【解决方案4】:

      我讨厌这个问题 - 我也花了好几个小时试图解决它。

      对我有用的是添加

      RAILS_ENV=production; source /usr/local/rvm/scripts/rvm;
      

      在捆绑命令之前。

      【讨论】:

      • 我想我明白了。如果您不是 RVM 用户,则没有问题,但如果您是,则最好遵守以下准则:rvm.io/integration/cron 因此,通过使用 RVM 生成的包装器,我设法在 crontab 中提供了一个干净的语法,实际上工作... 1 0 * * * cd ~/Desktop/cellar/ && /home/jose/.rvm/bin/rake-ruby-1.9.3-p0 wines:destroy_from_1969 >> ~/Desktop/cron_log.log 2> &1 用于位于 ~/Desktop/cellar/ 的 Rails 应用程序
      【解决方案5】:

      忘记 cron 文件中的 PATH 设置。设置 PATH 不起作用。

      在 config/schedule.rb 中明确设置捆绑路径

      set :bundle_command, "/usr/local/bin/bundle"

      【讨论】:

        【解决方案6】:

        我认为您应该尝试在您的 crontab 中明确设置 GEM_HOME 和 GEM_PATH 环境变量。您也可以尝试通过 cron 运行 gem list --localgem environment 之类的东西并检查输出。

        【讨论】:

          【解决方案7】:

          我整个下午都在玩这个,找不到更好的解决方案。这是我想出来的

          bundle install --binstubs
          

          然后运行

          bin/rake daily:stats
          

          【讨论】:

          • 您尝试过 Dennis 将 env :PATH, ENV['PATH'] 添加到您的 schedule.rb 的建议吗?这对我有用。
          【解决方案8】:

          您可以尝试以下我在谷歌搜索时发现的解决方案,最终对我有用....希望对您有用。

          我在生产中实现并测试了相同的内容,确保相应地更改环境 -

          set :output, "{your path on the server}/log/cron_log.log"
           set :environment, :production
           env :PATH, ENV['PATH']
           job_type :rbenv_rake, %q!eval "$(rbenv init -)"; cd :path && :environment_variable=:environment bundle exec rake :task --silent :output!
          

          祝你好运,这个问题发生在我使用了 3 年之后,之前只是简单地在生产的 gem 文档中给出的内容。

          我使用 Ruby 2.x 和 Rails 4.2 以及 0.9.4 最新版本。如果问题的性质相同,它也应该适用于早期版本。

          谢谢。

          【讨论】:

            【解决方案9】:

            通过这种方式执行命令:/bin/bash -l -c

            您正在作为登录 shell 启动一个 bash 命令,它将获取(执行)/etc/profile bash 文件作为设置文件。通过这样做,如果您检查此文件,它可能有 bash 命令行会删除您以前不希望的 $PATH,因为它首先包含您的包的路径和所有其他命令。

            要解决此问题,您只需删除与在 /etc/profile 文件中设置 $PATH 变量相关的行。

            【讨论】:

              【解决方案10】:

              这是 ENV['PATH'] 未设置问题。解决此问题的最优雅方法是在安装后立即将 rvm 相关脚本附加到路径中。将以下行添加到 .bashrc 的开头(开头而不是结尾,因为当非交互式 shell 访问 .bashrc 时,[ -z "$PS1" ] &amp;&amp; return 行会抛出错误,并且不会执行后续行。

              PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
              [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
              

              不要尝试显式设置 PATH 和 sully 环境变量。

              【讨论】:

                【解决方案11】:

                对于使用 rbenv 的用户,您可以使用随附的垫片 /home/username/.rbenv/shims/bundle

                0 0 * * * /bin/bash -l -c 'cd /home/af/www/app/releases/20120216172204 && RAILS_ENV=production /home/af/.rbenv/shims/bundle exec rake daily:stats --silent >> /home/af/www/app/releases/20120216172204/log/cron.log 2>&1'
                

                【讨论】:

                  【解决方案12】:

                  在2021年,我找到了一个基本的解决方案,只需在schedule.rb之上添加即可

                   env :PATH, ENV['PATH']
                   set :output, "log/cron_log.log"
                   set :runner_command, "rails runner"
                  

                  来自:

                  https://github.com/javan/whenever/issues/665

                  【讨论】:

                    【解决方案13】:

                    我通过打印环境变量解决了这个问题

                    printenv
                    

                    找到看起来与 Rails 相关的那些。一个是 gems 的路径,另一个是 GEM_HOME 并在 cron 中的命令前加上这两个:

                    PATH=$PATH:/home/petr/gems/bin GEM_HOME=/home/petr/gems program_executable
                    

                    【讨论】:

                      【解决方案14】:

                      同样在 2021 年,在 schedule.rb 中添加这个对我有用:

                      set :job_template, "bash -l -c 'PATH=#{ENV['PATH']} && :job'"
                      

                      默认情况下,所有作业都使用 bash -l -c 'command...' (https://github.com/javan/whenever) 运行

                      所以我一开始就在 PATH 中设置了 bash include ENV['PATH'],现在从正确的 rbenv 调用 rails。

                      【讨论】:

                        【解决方案15】:

                        对于现代修复,在 capistrano deploy.rb 中添加这一行,

                        set :whenever_command, "bundle exec whenever"
                        

                        【讨论】:

                        • 相反,根据我的回答设置 :bundle_command, "/usr/local/bin/bundle"。忘记尝试让 PATH 工作。
                        【解决方案16】:

                        [root@smbserver 当前]# crontab -e

                        02 22 * * 1-5 /bin/bash -l -c  /shell/day.sh 
                        30 14 * * 0 /bin/bash -l -c  /shell/week.sh 
                        

                        【讨论】:

                          猜你喜欢
                          • 2015-07-08
                          • 2011-04-24
                          • 1970-01-01
                          • 1970-01-01
                          • 2023-03-18
                          • 2012-12-03
                          • 1970-01-01
                          • 2022-06-14
                          • 2013-07-03
                          相关资源
                          最近更新 更多