2013-10-10 64 views
0

我有一个ruby sinatra应用程序,它有一个rake任务,它将使用活动记录来检查数据库中的数据文件。我使用when gem来按计划运行这个rake任务。这工作很好,一段时间后,几天后它会失败,看起来它无法写入日志文件。我有一个救援,将通过电子邮件发送我的错误和堆栈跟踪,这就是我得到:Ruby Crontab Rake任务失败,但只有当命令由crontab运行时

Broken pipe - 
/usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/logger.rb:578:in `write' 
/usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/logger.rb:578:in `warn' 
/usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/logger.rb:578:in `rescue in write' 
/usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/logger.rb:562:in `write' 
/usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/logger.rb:382:in `add' 
/usr/local/rvm/rubies/ruby-2.0.0-p195/lib/ruby/2.0.0/logger.rb:456:in `error' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:428:in `rescue in log' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_adapter.rb:425:in `log' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:286:in `execute' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/mysql2_adapter.rb:220:in `execute' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/mysql2_adapter.rb:224:in `exec_query' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/mysql2_adapter.rb:233:in `select' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:24:in `select_all' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/query_cache.rb:63:in `select_all' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:30:in `select_one' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/connection_adapters/abstract/database_statements.rb:36:in `select_value' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/relation/finder_methods.rb:174:in `exists?' 
/home/deployer/public/fulfillment_api/shared/bundle/ruby/2.0.0/gems/activerecord-4.0.0/lib/active_record/querying.rb:3:in `exists?' 
/home/deployer/public/fulfillment_api/releases/20131010141756/app/models/clients/test/order_file.rb:39:in `block in create_new_orders' 

每当宝石看起来像这样由创建的crontab中:

0 0,12 * * * /bin/bash -l -c 'cd /home/deployer/public/fulfillment_api/releases/20131010141756 && RACK_ENV=production bundle exec rake background_jobs:process_and_email['\''[email protected]'\''] --silent' 

是什么奇怪的是,当我将这个命令放到命令行中时,它运行良好。即使我将用户切换到root并运行它,它仍然可以毫无问题地运行。我只在crontab运行时发生错误。

+0

当“crontab”作业运行时,“PATH”的设置与刚刚登录时不同。您需要确保在cron作业中设置所需的'PATH'项目。 – lurker

+0

嗨@mbratch,感谢您的评论。我尝试将PATH设置为我登录时的相同值,但仍得到相同的结果。 – khartnett

+0

当你在命令行上运行它时,你是用'/ bin/bash ...'来做它吗? – lurker

回答

0

找到这个答案后:

https://stackoverflow.com/a/14792306/1512654

我试图设置RVM并记录输出。这似乎得到它的工作。在删除多余的部分后,我发现我只需要在cron任务结束时添加“> /tmp/cron_log.log”以使其工作。我不确定这个工作的原因。我在猜测cron工作是否遇到了STDOUT问题?