2010-12-13 8 views
1

J'essaie d'utiliser la gemme whenever pour exécuter quelques tâches de rake. Il semble configurer les tâches cron correctement - l'information ici provient de la sortie mail qui est produite. Voici un exemple de la commande exécutée:Mauvais chemin ruby ​​utilisé dans la tâche de rake exécutée comme cron through à chaque fois

/bin/bash -l -c 'cd /path/to/deployed/app && RAILS_ENV=production 

râteau propre: ma: tâche --silent »

Et voici quelques-unes des variables d'environnement:

X-Cron-Env: <SHELL=/bin/sh> 
X-Cron-Env: <PATH=/usr/bin:/bin> 

Et voici l'erreur ce qui suit:

/bin/bash: /usr/bin/rake: /usr/bin/ruby: bad interpreter: No such file or directory 

Lorsque je suis connecté, je peux exécuter ces tâches de rake à partir du même répertoire, mais quand je lance

which ruby 

je reçois

/usr/local/bin/ruby 

Il semble y avoir un 'râteau' dans/usr/bin, mais en cours d'exécution

/usr/bin/rake -T 

me donne la même erreur:

-bash: /usr/bin/rake: /usr/bin/ruby: bad interpreter: No such file or directory 

Quel serait le be st chemin pour résoudre ce problème?

Répondre

5

Est-ce que/usr/local/bin/se trouve sur votre chemin? Lorsque vous avez exécuté which ruby ​​vous avez/usr/local/bin/ruby, mais lorsque vous exécutez le râteau cherche/usr/bin/ruby ​​

Ou vous pouvez simplement symlink rubis comme:

sudo ln -s/usr/local/bin/ruby ​​/ usr/bin /.

+0

droit, est logique - merci.Mais comment puis-je faire un ajustement comme celui de l'utilisateur que le travail cron est en cours d'exécution? Parce qu'en ce moment qui vient ressemble à: tous les 10.minutes font râteau « propre: ma: tâche » fin et je ne vois vraiment pas comment régler le chemin que context.Should soit fait dans le chaque fois que l'installation en quelque sorte, ou devrait-il être fait dans l'environnement Linux? – ilasno

+0

Désolé, pas de code dans les commentaires ..: -/ – ilasno

+0

puisque votre tâche rake recherche/usr/bin/ruby ​​et il n'existe pas, faire "sudo ln -s/usr/local/bin/ruby ​​/ usr/bin /. " va créer un lien depuis votre ruby ​​dans/usr/local/bin/vers/usr/bin/alors rake devrait alors le trouver, peu importe l'utilisateur. –

1

Voici ce que j'utilise maintenant:

every 1.day, :at => '5am' do 
    # It appears that, when the following tasks are executed through 
    # cron, /usr/local/bin is not in the path (which is the ruby/RoR installation that should be used) 
    # So we need to make sure that the proper ruby/RoR installation can be found 
    # (Unfortunately this seems to restrict us to using the 'command' option, and leaves us unable 
    # to use the other options: 'runner' and 'rake' because i'm not sure how you'd affect the PATH 
    # environment variable for those) 

    # (alot of what's below is just meant to provide a bit of visibility to the execution within cron) 
    cmd_root = "PATH=/usr/local/bin:$PATH" 
    cmd_root = cmd_root + " && " 
    cmd_root = cmd_root + "export PATH" 
    cmd_root = cmd_root + " && " 
    cmd_root = cmd_root + "cd #{path}" 
    cmd_root = cmd_root + " && " 
    cmd_root = cmd_root + "pwd " 
    cmd_root = cmd_root + " && " 
    cmd_root = cmd_root + "echo $PATH" 
    cmd_root = cmd_root + " && " 
    cmd_root = cmd_root + "echo $RAILS_ENV" 
    cmd_root = cmd_root + " && " 
    cmd_root = cmd_root + "which ruby" 

    # Execute the rake task, using 'command' 
    cmd = cmd_root + " && rake clean:my:task param=val" 
    command cmd 

    # Without another way of manipulating the environment PATH, this isn't working right: 
    #rake "clean:my:task" 
end 

Depuis que je suis juste en utilisant l'option « commande », cela me permet d'exécuter des commandes avant la tâche de coupe réelle, comme l'ajout du répertoire propre à le PATH pour que le bon rubis soit utilisé.

Je ne suis pas fou de la façon dont cela code dur une référence à/usr/local/bin, tho: - /. Et je ne sais pas comment je pourrais utiliser les options 'rake' ou 'runner' de n'importe quand. Mais cela semble fonctionner.

+0

vous pouvez utiliser + = à la place et garder la visibilité ... ou juste + pour chaque chaîne – Tor

1

J'avais un conflit avec les versions rakes ... Je l'avais d'abord installé avec apt-get puis avec gem ... donc j'ai supprimé toutes les versions ... J'ai même dû supprimer/usr/local/bin/ratisser manuellement. Réinstallé juste avec la gemme et maintenant cela fonctionne :) J'espère que cela aide quelqu'un.

+0

Je peux seconder cette approche a fonctionné pour moi. On dirait un moyen plus propre que les liens symboliques. – am17torres

0

Ajouter une ligne de code ci-dessous dans config/schedule.rb pour définir le chemin ruby ​​correct.

env :PATH, ENV['PATH'] 

puis exécutez les commandes ci-dessous

whenever --update-crontab  # to update crontab 
service crond restart   # to restart crontab 
Questions connexes