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