ruby-on-railsnginxcronpassengerrufus-scheduler

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


Solution

  • 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