Rufus 调度程序停止 Nginx 乘客中的文件操作

Rufus scheduler stops on file operations in Nginx passenger

Rails Rufus 调度程序执行一些文件操作。当我启动服务器时,rufus cron 被调用,但调度程序在遇到文件操作时停止

我的调度程序如下所示

deployed_test_scheduler = Rufus::Scheduler.new deployed_test_scheduler.cron("56 20 * * *") do OutputsController.deploy_tests puts "Got Deployed Tests" end

deploy_tests 方法的代码片段如下所示

....
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"
....

和production.log如下所示

..... I, [2016-12-08T05:03:57.193906 #27950] INFO -- : response0 .....

除 "response0" 外没有打印其他日志,但在 WEBrick 上运行完美

是什么导致 Nginx passenger 在遇到文件操作时停止进一步处理

p.s。 rails 版本 - 4.1.6 ruby 版本 - 2.2.0 乘客版本 - 5.0.30 nginx 版本 - 1.10.1

您的代码似乎遇到问题并引发错误。包起来。

试试:

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

它应该会告诉您目标文件路径(如果存在)以及发生了什么错误(如果有)。

附录:

如果您需要一个针对整个 rufus-scheduler 实例的错误处理程序,您可以覆盖它的 on_error 处理程序。

在你的情况下可能看起来像

# ...

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

# ...

https://github.com/jmettraux/rufus-scheduler#rufusscheduleron_errorjob-error