You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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时触发的信号),确保手动中断时也能优雅关闭服务器。

测试方法:

  1. 运行代码,服务器启动后如果2秒内没有任何请求,会自动打印关闭信息并终止进程。
  2. 如果在2秒内用浏览器或curl http://localhost:8000发送请求,超时时间会被重置,服务器会继续运行,直到再次闲置2秒以上。

这样就能完美实现你想要的「无请求超时自动终止」功能了。

内容的提问来源于stack exchange,提问作者tscheingeld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:57:39