52

我正在尝试每天执行一次 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

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

4

16 回答 16

65

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

env :PATH, ENV['PATH']

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

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

env :GEM_PATH, ENV['GEM_PATH']
于 2012-06-15T20:11:50.330 回答
6

就我而言,我刚刚跑了:

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

参考cron 作业设置文档

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

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

干杯!!!

于 2015-10-22T01:32:22.187 回答
4

经过这么多尝试后,以下似乎工作

从终端输入以下内容

  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 会误导环境。

于 2012-09-12T11:17:44.313 回答
3

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

对我有用的是添加

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

在捆绑命令之前。

于 2012-02-28T18:20:12.870 回答
2

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

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

设置:bundle_command,“/usr/local/bin/bundle”

于 2014-12-28T18:38:29.937 回答
1

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

于 2012-02-28T15:57:50.427 回答
1

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

bundle install --binstubs

然后运行

bin/rake daily:stats
于 2012-02-28T17:51:58.253 回答
1

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

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

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 最新版本。如果问题的性质相同,它也应该适用于早期版本。

谢谢你。

于 2016-03-16T13:52:51.743 回答
1

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

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

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

于 2018-01-15T05:53:31.050 回答
0

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

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

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

于 2013-07-25T12:31:23.273 回答
0

对于那些使用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'
于 2020-10-18T09:46:13.293 回答
0

在 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

于 2021-01-11T12:47:04.727 回答
0

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

printenv

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

PATH=$PATH:/home/petr/gems/bin GEM_HOME=/home/petr/gems program_executable
于 2021-02-03T05:14:28.717 回答
0

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

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

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

所以我一开始就让 bash 在 PATH 中包含 ENV['PATH'] ,现在从正确的 rbenv 调用 rails 。

于 2021-03-24T22:24:52.233 回答
-1

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

set :whenever_command, "bundle exec whenever"
于 2013-08-08T08:41:46.093 回答
-5

[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 
于 2013-07-11T04:11:08.593 回答