我尝试使用每当每天执行一次 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
工作正常,不知道这里发生了什么。
您还可以通过将以下内容放在 Schedule.rb 文件的顶部来确保您的 PATH 最终出现在 crontab 中:
env :PATH, ENV['PATH']
https://groups.google.com/forum/#!msg/whenever-gem/yRLt3f2jrfU/Exu3xfCo8DAJ
如果上述解决方案不适合您,请尝试:
env :GEM_PATH, ENV['GEM_PATH']
就我而言,我只是跑了:
rvm env --path -- ruby-version[@gemset-name]
在 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
干杯!!!
经过多次尝试,以下似乎有效
从终端输入以下内容
输入 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
注释掉以 PATH 开头的两行。
每当运行“bundle execwhen”命令时,请执行上述步骤。而且它有效。
不知道为什么 PATH 会误导环境。
我讨厌这个问题 - 我也花了几个小时试图解决它。
对我有用的是添加
RAILS_ENV=production; source /usr/local/rvm/scripts/rvm;
在捆绑命令之前。
忘记 cron 文件中的 PATH 设置。设置 PATH 不起作用。
在 config/schedule.rb 中明确设置捆绑路径
设置:bundle_command,“/usr/local/bin/bundle”
您可以尝试以下我在谷歌搜索时找到的解决方案,它最终对我有用......希望它能与您一起工作。
我在生产中实现并测试了相同的内容,确保相应地改变环境 -
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 最新版本。如果问题的性质相同,它也应该适用于早期版本。
谢谢你。
我认为您应该尝试在 crontab 中显式设置 GEM_HOME 和 GEM_PATH 环境变量。您还可以尝试通过 cron 运行类似
gem list --local
或 gem environment
的内容并检查输出。
我整个下午都在研究这个问题,找不到更好的解决方案。这是我想到的
bundle install --binstubs
然后运行
bin/rake daily:stats
通过这种方式执行命令:
/bin/bash -l -c
您正在启动 bash 命令作为登录 shell,它将源(执行)
/etc/profile
bash 文件作为安装文件。通过这样做,如果您检查此文件,它可能会包含 bash 命令行,从而删除您之前的 $PATH
,这是您不希望看到的,因为它首先包含您的包路径和所有其他命令。
要解决此问题,您只需删除
$PATH
文件中与设置 /etc/profile
变量相关的行即可。
这是一个 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 环境变量。
对于使用
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'
在2021年,我找到了一个基本的解决方案,只需添加在
schedule.rb
之上
env :PATH, ENV['PATH']
set :output, "log/cron_log.log"
set :runner_command, "rails runner"
来自:
我通过打印我的环境变量解决了这个问题
printenv
找到那些看起来与 Rails 相关的内容。一个是通往 gems 的路径,另一个是
GEM_HOME
并在 cron 中的命令前面加上这两个:
PATH=$PATH:/home/petr/gems/bin GEM_HOME=/home/petr/gems program_executable
同样在 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。
2023年,仍然有这个问题。在开发过程中对我有用的东西。 将这些调整为生产路径/设置。
set :bundle_command, "/Users/$username/.rbenv/shims/bundler exec"
set :environment, :development
set :output, {:error => "log/cron_error_log.log", :standard => "log/cron_log.log"}
对我有用的:我从
-l
中删除了
job_template
选项
例如:
0 0 * * * /bin/bash -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'
开
schedule.rb
set :job_template, "bash -c ':job'"
来源:https://github.com/javan/whenever#define-your-own-job-types
对于现代修复,请在 capistrano deploy.rb 中添加此行,
set :whenever_command, "bundle exec whenever"
[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