无论什么时候Rails cron,设置环境

Ton*_*ony 31 cron ruby-on-rails whenever

如果您了解创建cron作业的gem,那么这个问题可能才有意义.我的schedule.rb中有一项任务

every 1.day, :at => '4am' do
  command "cd #{RAILS_ROOT} && rake thinking_sphinx:stop RAILS_ENV=#{RAILS_ENV}"
  command "cd #{RAILS_ROOT} && rake thinking_sphinx:index RAILS_ENV=#{RAILS_ENV}"
  command "cd #{RAILS_ROOT} && rake thinking_sphinx:start RAILS_ENV=#{RAILS_ENV}"
end
Run Code Online (Sandbox Code Playgroud)

但是,当我使用更新我的crontab时

whenever --update-crontab appname --set environment=production
Run Code Online (Sandbox Code Playgroud)

cron作业仍然有RAILS_ENV =开发.我的生产和开发任务现在是一样的,我只需要改变环境变量,因为thinking_sphinx需要知道当前的环境.关于如何做到这一点的任何想法?

谢谢!

小智 89

每当不检测您的环境时,它只是默认使用生产.您可以使用set为所有作业设置环境:

set :environment, 'staging' 
Run Code Online (Sandbox Code Playgroud)

或按工作:

every 2.hours do 
  runner 'My.runner', :environment => 'staging' 
end 
Run Code Online (Sandbox Code Playgroud)

  • 我可以将数组传递给`environment`来设置多个环境吗? (5认同)

Sim*_*tti 25

不要写RAILS_ENV变量.它应该自动设置.

every 1.day, :at => '4am' do
  command "cd #{RAILS_ROOT} && rake thinking_sphinx:stop"
  command "cd #{RAILS_ROOT} && rake thinking_sphinx:index"
  command "cd #{RAILS_ROOT} && rake thinking_sphinx:start"
end
Run Code Online (Sandbox Code Playgroud)

它适用于我的应用程序:

every 4.days do
  runner "AnotherModel.prune_old_records"
end

$ whenever --set environment=production
0 0 1,5,9,13,17,21,25,29 * * /Users/weppos/Sites/git/app/script/runner -e production "AnotherModel.prune_old_records"

$ whenever --set environment=development
0 0 1,5,9,13,17,21,25,29 * * /Users/weppos/Sites/git/app/script/runner -e development "AnotherModel.prune_old_records"
Run Code Online (Sandbox Code Playgroud)


小智 19

对于 Whenever (0.9.2)

使用该@environment变量进行环境检查:

case @environment

when 'production'

every 1.minutes do

   rake "user:take_sample"

  end

when 'development'

every 1.minutes do

  rake "user:dev_sample"

  end

end
Run Code Online (Sandbox Code Playgroud)

  • 但请注意,@ environment环境变量默认为"生产".当你吐出你的工作时,你必须"每当--set environment = development --write-crontab",然后这个答案就可以了. (5认同)

Tim*_*ore 16

如果你正在使用bundler和capistrano,你可能想要尝试的其他东西.

在deploy.rb文件中,当您设置:never_command时,请勿执行以下操作:

set :whenever_command, "bundle exec whenever"
Run Code Online (Sandbox Code Playgroud)

相反,这样做:

set(:whenever_command) { "RAILS_ENV=#{rails_env} bundle exec whenever" }
Run Code Online (Sandbox Code Playgroud)

现在,在加载schedule.rb文件时,RAILS_ENV环境变量将可用,因此在schedule.rb中,您现在可以执行以下操作:

set :environment, ENV['RAILS_ENV']
Run Code Online (Sandbox Code Playgroud)

瞧!你准备好了.


kac*_*984 10

注意你是否想要传递多个参数.
你必须这样做:

whenever --update-crontab appname --set 'environment=production&cron_log=/path/to/log'
Run Code Online (Sandbox Code Playgroud)


Jon*_* R. 9

这个问题已经开放了很长时间,所以我想我会分享0.9.7,Ruby 2.4.0和RAILS 5.0.1时的工作原理.在前面提到的答案中有很多接近尝试,但语法错误困扰他们.以下是有效的方法,也是非常简单的方法.

schedule.rb

require File.expand_path(File.dirname(__FILE__) + '/environment')
set :output, {:standard => 'log/cron_log.log', :error => 'log/cron_error_log.log'}
env :PATH, ENV['PATH']

every :day, :at => '10am' do
     rake "somejob:run", :environment => @environment
end
Run Code Online (Sandbox Code Playgroud)

更新crontab(dev)

whenever --set 'environment=development' --update-crontab
Run Code Online (Sandbox Code Playgroud)

结果(DEV)

0 10***/bin/bash -l -c'cd/my/rails/app && RAILS_ENV =开发包exec rake somejob:run --silent >> log/cron_log.log 2 >> log/cron_error_log.log'

更新crontab(prod)

whenever --set 'environment=production' --update-crontab
Run Code Online (Sandbox Code Playgroud)

结果(正式版)

0 10***/bin/bash -l -c'cd/my/rails/app && RAILS_ENV =生产包exec rake somejob:运行--silent >> log/cron_log.log 2 >> log/cron_error_log.log'

希望这可以帮助某人.快乐编码这个!

  • env:PATH,ENV ['PATH'} ?? (2认同)

Lau*_*nas 6

最新的每一次都可以轻松实现Capistrano集成 您可以向deploy.rb添加以下内容:

set :whenever_environment, defer { stage }
set :whenever_identifier, defer { "#{application}-#{stage}" }

require "whenever/capistrano"
Run Code Online (Sandbox Code Playgroud)


小智 -10

我会考虑使用“rake”快捷方式使其更加干净:

every 1.day, :at => '4am' do
  rake "thinking_sphinx:stop"
  rake "thinking_sphinx:index"
  rake "thinking_sphinx:start"
end
Run Code Online (Sandbox Code Playgroud)

  • 这个答案并没有告诉我们如何改变环境,它只是提供了一种使任务更干净的方法。检查 Trung LE 的答案,了解真正的方法 (31认同)