Reputation: 459
Rails Rufus scheduler perform some file operations. When I start the server, the rufus cron is invoked but the scheduler stops once it encounters file operations
My scheduler looks like below
deployed_test_scheduler = Rufus::Scheduler.new
deployed_test_scheduler.cron("56 20 * * *") do
OutputsController.deploy_tests
puts "Got Deployed Tests"
end
and the code snippet of deploy_tests methods looks like below
....
Rails.logger.info "response0"
target = open(filepath, 'w')
Rails.logger.info "response1"
target.write(response)
Rails.logger.info "response2"
target.close
Rails.logger.info "response3"
....
and production.log looks like below
.....
I, [2016-12-08T05:03:57.193906 #27950] INFO -- : response0
.....
no other logs are printed expect "response0", but works perfectly on WEBrick
What is causing Nginx passenger to stop further processing when it encounters File operations
p.s. rails version - 4.1.6 ruby version - 2.2.0 passenger version - 5.0.30 nginx version - 1.10.1
Upvotes: 1
Views: 142
Reputation: 3551
Seems like your code is encountering a problem and raising an error. Wrap it.
Try with:
begin
Rails.logger.info "filepath is #{filepath}"
Rails.logger.info "filepath exists? #{File.exist?(filepath)}"
target = open(filepath, 'w')
Rails.logger.info "response1"
target.write(response)
Rails.logger.info "response2"
target.close
Rails.logger.info "response3"
rescue => err
Rails.logger.error "something went wrong: " + err.inspect
err.backtrace.each_with_index { |l, i| Rails.logger.error("#{i}: #{l}") }
end
It should tell you what filepath you are targetting, if it exists, and what error occurs, if any.
Addendum:
If you need an error handler for the whole of the rufus-scheduler instance, you can override its on_error
handler.
In your case that might look like
# ...
deployed_test_scheduler = Rufus::Scheduler.new
def deployed_test_scheduler.on_error(job, error)
Rails.logger.error(
"err#{error.object_id} rufus-scheduler intercepted #{error.inspect}" +
" in job #{job.inspect}")
error.backtrace.each_with_index do |line, i|
Rails.logger.error(
"err#{error.object_id} #{i}: #{line}")
end
end
# ...
See https://github.com/jmettraux/rufus-scheduler#rufusscheduleron_errorjob-error
Upvotes: 1