web-dev-qa-db-ja.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 = developmentがあります。実動と開発に関する私のタスクは現在同じですが、thinking_sphinxが現在の環境を知る必要があるため、環境変数を変更する必要があります。これを行う方法に関するアイデアはありますか?

ありがとう!

31
Tony

環境が検出されない場合は、デフォルトで本番環境が使用されます。 setを使用して、すべてのジョブの環境を設定できます。

set :environment, 'staging' 

またはジョブごと:

every 2.hours do 
  runner 'My.runner', :environment => 'staging' 
end 
89
Trung LE

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"
25
Simone Carletti

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
19
yogendra689

Bundlerとcapistranoを使用している場合は、他に試してみてください。

Deploy.rbファイルで、:whenever_commandを設定すると、DO NOTがこれを実行します。

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']

出来上がり!あなたは行く準備ができています。

16
Tim Lowrimore

いつでも複数のパラメータを渡したい場合は注意してください。
そのようにする必要があります:

whenever --update-crontab appname --set 'environment=production&cron_log=/path/to/log'
10
kaczor1984

この質問は長い間開かれていたので、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 = development bundle 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 = production bundle exec rake somejob:run --silent >> log/cron_log.log 2 >> log/cron_error_log.log'

うまくいけば、これは誰かを助けることができます。これをハッピーコーディング!

8
Jon R.

Capistranoを簡単に統合できる場合は常に最新です。 deploy.rbに以下を追加できます。

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

require "whenever/capistrano"
6
Laurynas

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
0

私は、cronジョブ-/ usr/local/bin/bundleの代わりに/ usr/bin/bundleがピックアップされていたときに、環境がセットアップされていないという問題を抱えていました。

解決策は、schedule.rbの先頭に以下を追加することでした。

env 'PATH', ENV['PATH']
0
Snips