在cron中运行时Rake任务失败

我正在使用backup_fu来备份我的数据库。 在crontab中,你有这个命令:

* * * * * cd /var/www/amplify/current && RAILS_ENV=production /usr/bin/env rake backup 

是的,我知道一分钟的备份是激烈的,但我只是在做这个testing。 一旦我开始工作,我会改变这个间隔。

  • 但是,在cron中运行它不会被备份。 当我检查我的Amazon S3帐户时,我看不到.tar.gz文件。
  • 当我SSH进来,我准确地粘贴命令,它备份,我看到在Amazon S3中的.tar.gz。

注意:

  • 我正在使用RVM。 但是,正如在这个线程所示,如果我cd到目录中,正确的rubyselect发生。
  • 我在CentOS上: Linux version 2.6.18-194.8.1.el5.028stab070.5 (root@rhel5-build-x64) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Fri Sep 17 19:10:36 MSD 2010
  • 我检查了/var/log/cron ,它似乎运行: Feb 27 00:20:01 amplify crond[1667]: (ramon) CMD (cd /var/www/amplify/current && RAILS_ENV=production /usr/bin/env /usr/bin/rake backup)

任何帮助表示赞赏,谢谢!

看来,这最终成为一个RVM的问题,而不是服务器之一。 我道歉。 感谢您的回答; 他们帮我弄清楚了。

最后一个工作是:

 cd /var/www/amplify/current && source /home/ramon/.rvm/environments/ree-1.8.7-2010.02@rails3 && RAILS_ENV=production /home/ramon/.rvm/gems/ree-1.8.7-2010.02@rails3/bin/rake backup &>/home/ramon/backup.log 

关键是使用source /home/ramon/.rvm/environments/ree-1.8.7-2010.02@rails3

当我问韦恩Seguin关于进入目录和自动加载.rvmrc,他说,只有在以下情况下才能工作:

  • RVM作为函数正确加载(typesrvm | head -1)
  • .rvmrc先前已被信任

所以看来在cron中,RVM作为一个函数没有正确加载,因为之前我已经“信任”.rvmrc。

您是否检查过运行cron作业的帐户的邮件,命令的输出应该显示在那里,并且可能包含有关该问题的线索。

将命令的输出捕获到文件add &>/path/to/logfile到命令末尾,以查明发生了什么。

这个:

 /usr/bin/env rake backup 

取决于包含rake位置的PATH 。 这和简单的一样

 rake backup 

cron的环境与交互式会话的环境不同。 将crontab中的行改为直接指向rake可执行文件:

 * * * * * cd /var/www/amplify/current && RAILS_ENV=production /path/to/rake backup 

或者设置你的crontab的PATH (在crontab中)来包含它:

 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/path/to/where/rake/is 

设置PATH在你的crontab是不是很便携,我build议你做这样的事情:

 ~ $ rvm env --path /Users/james/.rvm/environments/ruby-1.9.3-p392 

那个文件里有什么:

 ~ $ cat `rvm env --path` export PATH ; PATH="/Users/james/.rvm/gems/ruby-1.9... 

所以我们可以做到这一点:

 ~ $ crontab -e 0 * * * * source /Users/james/.rvm/environments/ruby-1.9.3-p392 && command # or 0 * * * * rvm use 1.9.3@myenv && source `rvm env --path` && command 

把你的cronjob放到单独的脚本中,并在crontab中调用它。

 cd / var / www / amplify / current && RAILS_ENV =生产/ usr / bin / env rake备份