web-dev-qa-db-fra.com

Rails cron avec chaque fois, définissant l'environnement

Cette question n'aura probablement de sens que si vous connaissez la gemme de création de tâches cron. J'ai une tâche dans mon agenda.rb comme

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

Cependant, lorsque je mets à jour mon crontab en utilisant

whenever --update-crontab appname --set environment=production

les jobs cron ont toujours Rails_ENV = development. Mes tâches de production et de développement sont les mêmes pour le moment, il me suffit de changer la variable d'environnement car thinking_sphinx a besoin de connaître l'environnement actuel. auriez vous des idées pour faire ça?

Merci!

31
Tony

Chaque fois que ne détecte pas votre environnement, il utilise par défaut la production. Vous pouvez définir l'environnement de tous les travaux à l'aide de set:

set :environment, 'staging' 

Ou par tâche:

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

N'écrivez pas la variable Rails_ENV. Il devrait le définir automatiquement.

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

Cela fonctionne dans mon application:

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

Pour Whenever (0.9.2)

Utilisez le @environment variable pour la vérification de l'environnement:

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

Vous voudrez peut-être essayer autre chose si vous utilisez bundler et capistrano.

Dans votre fichier deploy.rb, lorsque vous définissez la commande: every_command, DO NOT faites simplement ceci:

set :whenever_command, "bundle exec whenever"

Au lieu de cela, faites ceci:

set(:whenever_command) { "Rails_ENV=#{Rails_env} bundle exec whenever" }

Désormais, la variable d'environnement Rails_ENV sera disponible lorsque le fichier schedule.rb est chargé, donc dans schedule.rb, vous pouvez maintenant faire ceci:

set :environment, ENV['Rails_ENV']

Voila! Vous êtes prêt à partir.

16
Tim Lowrimore

Faites attention si vous voulez passer plus d'un paramètre à chaque fois.
Vous devez le faire comme ça:

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

Cette question est ouverte depuis longtemps, alors j'ai pensé partager ce qui fonctionnait avec 0.9.7, Ruby 2.4.0, et Rails 5.0.1 Dans la réponse mentionnée précédemment, il y a beaucoup d'essais rapprochés mais une erreur de syntaxe les tourmente. Voici ce qui a fonctionné et est une approche très simple.

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

Mettre à jour le crontab (dev)

whenever --set 'environment=development' --update-crontab

Résultats (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'

Mettre à jour le crontab (prod)

whenever --set 'environment=production' --update-crontab

Résultats (prod)

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'

J'espère que cela peut aider quelqu'un. Bon codage!

8
Jon R.

La dernière fois permet une intégration facile de Capistrano. Vous pouvez ajouter ce qui suit à deploy.rb:

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

require "whenever/capistrano"
6
Laurynas

Ajoutez la ligne de code suivante en haut de config/schedule.rb.

 ENV['Rails_ENV'] = "#{@pre_set_variables[:environment]}"

et mettez à jour le crontab à l'aide de la commande suivante.

whenever --update-crontab pvcnxt --set 'environment=production'

puis enfin redémarrez crontab en utilisant la commande

service crond restart

C'est tout!

Final config/schedule.rb ressemble à ceci

 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
Satishakumar Awati

J'avais un problème où l'environnement n'était pas configuré pour chaque fois que les tâches cron -/usr/bin/bundle étaient récupérées au lieu de/usr/local/bin/bundle.

La solution consistait à ajouter le suivi en haut de schedule.rb

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