Mes tâches rake ne fonctionnent pas avec cron


#1

Salut à tous,

Je rencontre un problème avec mes tâches rake programmées par un cron :
une erreur me dit que le gem rack 1.0.1 n’est pas présent. Or, si je
lance les tâches manuellement en ligne de commande, l’erreur ne survient
pas.

Voilà la commande que je lance dans mon cron :
0 5 * * * cd /home/user/site && /usr/local/bin/rake task
RAILS_ENV=production

Et voilà le début de la stack trace

rake aborted!
Could not find RubyGem rack (~> 1.0.1)
/home/user/site/config/…/vendor/rails/railties/lib/initializer.rb:271:in
require_frameworks' /home/user/site/config/../vendor/rails/railties/lib/initializer.rb:134:inprocess’
/home/user/site/config/…/vendor/rails/railties/lib/initializer.rb:113:in
send' /home/user/site/config/../vendor/rails/railties/lib/initializer.rb:113:inrun’
/home/user/site/config/environment.rb:9
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
gem_original_require' /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:inrequire’
/home/user/site/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in
require' /home/user/site/vendor/rails/activesupport/lib/active_support/dependencies.rb:521:innew_constants_in’
/home/user/site/vendor/rails/activesupport/lib/active_support/dependencies.rb:156:in
require' /home/user/site/vendor/rails/railties/lib/tasks/misc.rake:4 /usr/local/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:incall’

Sachant que si j’exécute manuellement :
/home/user/site/$ rake task
cela fonctionne sans problème.

Vous voyez d’où ça peut provenir?

Ma configuration :
rails 2.3.5
rake 0.8.7
rack 1.0.1
ruby 1.8.7

Merci d’avance pour votre aide,

Julien


#2

L’utilisateur de la tâche cron est-il bien le même avec lequel tu lances
rake directement ? Ne faut-il pas spécificé le GEM_PATH pour être sûr de
trouver la gem au bon endroit ?

++

yk

Le 4 février 2010 15:50, Julien L. removed_email_address@domain.invalid a
écrit :


#3

Sinon, je sais pas si cela peut aider mais j’ai utilise un plugin pour
gerer la crontab (taches relatives a un projet rails) sur un mes
projets et ca marche plutot pas mal:
http://github.com/latimes/craken/


#4

Je confirme, dans les cron il faut respécifier le PATH.

2010/2/4 Yann KLIS removed_email_address@domain.invalid


#5

Effectivement, le cron n’est pas exécuté par le même utilisateur (le
cron est exécuté par root).

Cependant, je précise le GEM_PATH dans mon crontab :
GEM_PATH=/usr/local/lib/ruby/gems/1.8

Et quand je fais un echo $GEM_PATH en étant connecté à mon nom (donc pas
le même utilisateur que lors du cron), je ne reçois rien, comme si le
GEM_PATH n’était pas initialisé dans ma session.

Je ne comprends donc toujours pas…

Le plugin craken a l’air vraiment bien : ça semble pas mal de
“railsifier” cet aspect là de l’administration serveur (pour ne rien
perdre au déploiement par exemple). Merci pour le tuyau.

Etienne Duputel wrote:

Je confirme, dans les cron il faut respécifier le PATH.

2010/2/4 Yann KLIS removed_email_address@domain.invalid


#6

Il fallait que j’installe la version 1.0.1 pour l’utilisateur root (sudo
gem install rack -v=1.0.1) pour que ça marche, car visiblement Rails
2.3.5 n’est pas compatible avec la dernière version de rack (1.1.0,
depuis le 3/1/2010).

Merci pour vos conseils (spécialement pour whenever, je vais le mettre
en place, ça a l’air très pratique)


#7

Le 4 février 2010 12:44, Julien L. removed_email_address@domain.invalid a
écrit :

Le plugin craken a l’air vraiment bien : ça semble pas mal de
“railsifier” cet aspect là de l’administration serveur (pour ne rien
perdre au déploiement par exemple). Merci pour le tuyau.

Il existe également whenever qui offre une DSL simple à utiliser
http://github.com/javan/whenever

every 3.hours do
runner “MyModel.some_process”
rake “my:rake:task”
command “/usr/bin/my_great_command”
end

every 1.day, :at => ‘4:30 am’ do
runner “MyModel.task_to_run_at_four_thirty_in_the_morning”
end

every :hour do # Many shortcuts available: :hour, :day, :month, :year,
:reboot
runner “SomeModel.ladeeda”
end

every :sunday, :at => ‘12pm’ do # Use any day of the week or
:weekend, :weekday
runner “Task.do_something_great”
end

Cordialement,
Florent


#8

J’aime bien Craken aussi.

Pour le root: tu veux vraiment faire tourner ton cron en root ?
Pourquoi ne pas utiliser le cron de l’utilisateur sous lequel tourne
ton appli ?

– Thibaut