2009-06-05 6 views
2

J'ai un fichier Rake, qui peut être exécuté avec succès à la ligne de commande. Lorsque je définis un cronjob pour exécuter ce fichier rake, la ligne "require 'json" "échoue. Ma conjecture est que cronjob a une variable d'environnement différente. Ça ne marche pas quand j'ai essayé de mettre "puts ENV" dans le script ruby. Je me demande donc ce que je devrais faire pour vérifier les différentes variables d'env et comment résoudre le problème. Merci.Rake ne fonctionne pas correctement dans cronjob

+0

utilisez-vous RVM? – cbrulak

Répondre

0

avez-vous

require 'rubygems' 

dans votre script? Par exemple. irb charge rubygems par défaut, tandis que normal l'exécution nécessite explicitement importer.

+0

Oui, j'ai besoin de 'rubygems'. Si je cours à la ligne de commande, rake data.rake, pas de problème. L'erreur se produit seulement à cronjob. – swingfuture

0

Premièrement: require "json" est probablement défaillant car les rubygems ne sont pas chargés. Vous pouvez probablement corriger cela en plaçant require 'rubygems' en haut, ou en ajoutant RUBYOPT=rubygems au début de la ligne de commande de travail cron ou à l'environnement de cron (vous pouvez généralement définir des variables d'environnement dans le crontab).

Pour répondre à votre problème de débogage ENV: est-il possible que puts ENV ne fonctionne pas parce que stdout est redirigé quelque part que vous ne connaissez pas pendant le travail cron (il ne peut certainement pas aller à votre terminal)? Vous pouvez essayer ce qui suit à la place:

File.open('/tmp/debug_env', 'w') do |f| 
    f.puts ENV.to_hash.inspect 
end 

Et puis jeter un oeil à /tmp/debug_env pour voir ce qui est là. Les variables d'environnement à surveiller sont: $USER, $GEM_HOME, $GEM_PATH, $RUBYOPT.

+0

D'abord j'ai des rubygems chargés, deuxièmement, j'ai essayé votre conseil en ajoutant RUBYOPT = rubygems à l'avant de cronjob, même erreur. Je vais essayer le débogage ENV. – swingfuture

3

Il se peut que vous l'invoquiez dans cron. Voilà ce qui fonctionne pour moi:

cd /full/path/to/rails_root && /full/path/to/rake RAILS_ENV=production my:task 
0

Une autre façon de le faire: écrire un script wrapper pour exécuter à partir Cron: première ligne - charger votre .profile (ou .bash_profile etc) deuxième ligne - exécuter votre script de coupe