如何实现WEBrick服务器超时无请求后自动终止进程?
解决WEBrick无请求超时后自动终止的问题
你的问题出在对WEBrick::Utils::TimeoutHandler的理解上——这个工具是用来给单个请求的处理过程设置超时的,不是让整个服务器在闲置一段时间后关闭。它抛出的Timeout::Error会被WEBrick的内部循环捕获并记录日志,但服务器本身不会停止运行,这就是为什么你看到错误后进程还在的原因。
要实现「无请求x秒后自动终止服务器」的需求,我们需要主动跟踪最后一次请求的时间,并用后台线程定期检查闲置时长,超时后调用服务器的shutdown方法优雅关闭进程。下面是完整的可运行代码:
require 'webrick' # 配置参数 PORT = 8000 INACTIVITY_TIMEOUT = 2 # 无请求2秒后关闭服务器 server = WEBrick::HTTPServer.new(:Port => PORT) last_request_time = Time.now # 处理所有请求,每次收到请求就重置最后请求时间 server.mount_proc '/' do |req, res| last_request_time = Time.now res.body = "Hello from WEBrick! Last request at #{last_request_time}" res.status = 200 end # 启动后台监控线程,定期检查闲置状态 Thread.new do loop do sleep 0.5 # 每隔0.5秒检查一次,可根据需要调整频率 if Time.now - last_request_time > INACTIVITY_TIMEOUT puts "\nNo requests for #{INACTIVITY_TIMEOUT} seconds. Shutting down server..." server.shutdown break # 退出监控线程 end end end # 处理Ctrl+C中断,确保优雅关闭 trap('INT') do puts "\nReceived interrupt signal. Shutting down server..." server.shutdown end puts "WEBrick server started on port #{PORT}." puts "Server will automatically shutdown after #{INACTIVITY_TIMEOUT} seconds of inactivity." server.start puts "Server stopped successfully."
代码说明:
- 跟踪请求时间:每次处理请求时更新
last_request_time,记录最近一次请求的时间点。 - 后台监控线程:每隔0.5秒检查当前时间与最后请求时间的差值,超过设定的超时时间就调用
server.shutdown——这个方法会停止WEBrick的事件循环,让进程正常退出。 - 信号处理:捕获
INT信号(也就是你按Ctrl+C时触发的信号),确保手动中断时也能优雅关闭服务器。
测试方法:
- 运行代码,服务器启动后如果2秒内没有任何请求,会自动打印关闭信息并终止进程。
- 如果在2秒内用浏览器或
curl http://localhost:8000发送请求,超时时间会被重置,服务器会继续运行,直到再次闲置2秒以上。
这样就能完美实现你想要的「无请求超时自动终止」功能了。
内容的提问来源于stack exchange,提问作者tscheingeld
相关产品推荐
相关产品推荐

