saranya elumalai
saranya elumalai

Reputation: 459

Rufus scheduler stops on file operations in Nginx passenger

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

Answers (1)

jmettraux
jmettraux

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

Related Questions