Cron travail ne peut pas charger gem

J’ai un script ruby ​​qui se connecte à un compartiment Amazon S3 et télécharge la dernière sauvegarde de production. J’ai testé le script (ce qui est très simple) et ça marche bien.

Cependant, lorsque je programme ce script pour qu’il soit exécuté en tant que tâche périodique, il semble échouer lorsqu’il charge la gem Amazon (aws-s3).

Les premières lignes de mon script ressemblent à ceci:

#!/usr/bin/env ruby require 'aws/s3' 

Comme je l’ai dit, quand je lance ce script manuellement, ça marche bien. Lorsque je l’exécute via un job cron programmé, il échoue lorsqu’il essaie de charger le gem:

`require ‘: pas de fichier à charger – aws / s3 (LoadError)

La crontab de ce script ressemble à ceci:

 0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1 

Au départ, je pensais que cela pouvait être dû au fait que cron s’exécute en tant qu’utilisateur différent, mais quand je fais un «whoami» au début de mon script ruby, il me dit qu’il fonctionne comme le même utilisateur.

J’ai également fait un init de bundle et ajouté le joyau à mon fichier gemfile, mais cela ne semble pas avoir d’effet.

Pourquoi cron ne parvient-il pas à charger la gemme? Je cours Ubuntu.

Si vous l’exécutez manuellement et que cela fonctionne, vous êtes probablement dans un environnement shell différent de celui exécuté par cron. Puisque vous mentionnez que vous êtes sur Ubuntu, les tâches cron s’exécutent probablement sous / bin / sh, et vous êtes manuellement les exécuter sous / bin / bash si vous n’avez rien changé.

Vous pouvez déboguer vos problèmes d’environnement ou modifier le shell sous lequel votre travail s’exécute.

Pour déboguer, il existe plusieurs façons de déterminer le shell utilisé par vos tâches cron. Il peut être défini dans

 /etc/crontab 

ou vous pouvez faire un travail cron pour vider vos informations d’environnement et de shell, comme cela a été mentionné dans cette réponse SO: Comment simuler l’environnement avec lequel cron exécute un script?

Pour basculer vers ce shell et voir les erreurs réelles provoquant l’échec de votre travail, faites

 sudo su env -i  (eg /bin/sh) 

Ensuite, en exécutant votre script, vous devriez voir quelles sont les erreurs et pouvoir les corriger (rubygems?).

L’option 2 consiste à changer de shell. Vous pouvez toujours essayer quelque chose comme:

  0 3 * * * /bin/bash -c '~/Downloader/download.rb > ~/Downloader/output.log 2>&1' 

Pour forcer votre travail dans bash. Cela pourrait aussi clarifier les choses.

Comme mentionné ici https://coderwall.com/p/vhv8aw, vous pouvez simplement essayer

rvm cron setup # let RMV do your cron settings

Assurez-vous de faire une copie de votre crontab avant d’exécuter cette commande

Vous pouvez également définir explicitement votre chemin Gem:

GEM_HOME="/usr/local/rvm/gems/ruby-1.9.2-p290@my-special-gemset"

Ajoutez ceci au début de votre cron

 PATH="/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4@global/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4/bin:/home/user/.rvm/gems/ruby-2.1.4@global/bin:/home/user/.rvm/rubies/ruby-2.1.4/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/home/user/.rvm/bin:/usr/local/sbin:/usr/sbin:/home/user/.rvm/bin:/home/user/.local/bin:/home/user/bin" GEM_HOME='/home/user/.rvm/gems/ruby-2.1.4' GEM_PATH='/home/user/.rvm/gems/ruby-2.1.4:/home/user/.rvm/gems/ruby-2.1.4@global' MY_RUBY_HOME='/home/user/.rvm/rubies/ruby-2.1.4' IRBRC='/home/user/.rvm/rubies/ruby-2.1.4/.irbrc' RUBY_VERSION='ruby-2.1.4' 

Dans un environnement non-cron, exécutez echo $PATH , copiez le chemin et collez-le dans votre crontab, avant votre commande:

 echo $PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 

et à l’intérieur de crontab:

 PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin 0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1