【问题标题】:Rufus scheduler stops on file operations in Nginx passengerRufus 调度程序停止 Nginx 乘客中的文件操作
【发布时间】:2017-04-23 06:37:14
【问题描述】:

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 方法的代码 sn-p 如下所示

....
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 乘客在遇到文件操作时停止进一步处理

附言rails 版本 - 4.1.6 ruby​​ 版本 - 2.2.0 乘客版本 - 5.0.30 nginx 版本 - 1.10.1

【问题讨论】:

  • 将您的代码包装在开始/救援块中并记录错误(如果有)。
  • 一个问题:你的stackoverflow.com/questions/41027855/…解决了吗?似乎是这样,因为 rufus-scheduler 没有被Passenger杀死。
  • 如果你暗示这是 rufus-scheduler 错误,你最好指出你使用的是什么版本。
  • 关于 stackoverflow.com/questions/41027855/… 乘客在没有 UI 请求的情况下不会为应用程序提供服务。一旦客户端触发 UI,乘客就会产生一个新进程并由于“min.instances”属性而使其保持活动状态 - 这确保了 rufus 调度程序被解雇。

标签: ruby-on-rails nginx cron passenger rufus-scheduler


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多