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!
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
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"
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
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.
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'
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.
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
whenever --set 'environment=development' --update-crontab
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'
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'
J'espère que cela peut aider quelqu'un. Bon codage!
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"
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
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']