无论什么时候Rails cron,设置环境
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无论什么时候Rails cron,设置环境相关的知识,希望对你有一定的参考价值。
如果您了解创建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
但是,当我使用更新我的crontab时
whenever --update-crontab appname --set environment=production
cron作业仍然有RAILS_ENV =开发。我的生产和开发任务现在是一样的,我只需要改变环境变量,因为thinking_sphinx需要知道当前的环境。关于如何做到这一点的任何想法?
谢谢!
我会考虑使用“rake”快捷方式使它更干净:
every 1.day, :at => '4am' do
rake "thinking_sphinx:stop"
rake "thinking_sphinx:index"
rake "thinking_sphinx:start"
end
每当不检测您的环境时,它只是默认使用生产。您可以使用set为所有作业设置环境:
set :environment, 'staging'
或按工作:
every 2.hours do
runner 'My.runner', :environment => 'staging'
end
不要写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
它适用于我的应用程序:
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"
对于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
如果你正在使用bundler和capistrano,你可能想要尝试的其他东西。
在deploy.rb文件中,当您设置:never_command时,不要只是这样做:
set :whenever_command, "bundle exec whenever"
相反,这样做:
set(:whenever_command) { "RAILS_ENV=#{rails_env} bundle exec whenever" }
现在,在加载schedule.rb文件时,RAILS_ENV环境变量将可用,因此在schedule.rb中,您现在可以执行以下操作:
set :environment, ENV['RAILS_ENV']
瞧!你准备好了。
注意你是否想要传递多个参数。 你必须这样做:
whenever --update-crontab appname --set 'environment=production&cron_log=/path/to/log'
最新的每一次都可以轻松实现Capistrano集成您可以向deploy.rb添加以下内容:
set :whenever_environment, defer { stage }
set :whenever_identifier, defer { "#{application}-#{stage}" }
require "whenever/capistrano"
这个问题已经开放了很长时间,所以我想我会分享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
更新crontab(dev)
whenever --set 'environment=development' --update-crontab
结果(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
结果(正式版)
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'
希望这可以帮助别人。快乐编码这个!
在config / schedule.rb顶部添加以下代码行。
ENV['RAILS_ENV'] = "#{@pre_set_variables[:environment]}"
并使用以下命令更新crontab。
whenever --update-crontab pvcnxt --set 'environment=production'
然后最后使用命令重启crontab
service crond restart
而已!
最终的config / schedule.rb看起来就是这样
ENV['RAILS_ENV'] = "#{@pre_set_variables[:environment]}"
env :PATH, ENV['PATH']
require File.expand_path(File.dirname(__FILE__) + "/environment")
set :output, "#{Rails.root}/logs/cron_log_#{ENV['RAILS_ENV']}.log"
every 1.day, :at => '00:00 am' do
command "cd #{Rails.root}/lib/tasks && rake clean__posts_table_rake"
end
以上是关于无论什么时候Rails cron,设置环境的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 中运行的 Rails 应用程序的脉冲或 cron 作业
使用日常 cron 作业在 Rails 中使用 Ice Cube 创建的事件的正确方法
以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?
为啥 rails 对咖啡脚本文件使用 .js.coffee 扩展名,因为它们无论如何都不能包含 JavaScript 代码?