如何实现inetd与warp协同工作并解决资源占用及退出问题
解决inetd与Warp协同的CPU/内存耗尽问题
首先,你的代码存在一个致命的变量绑定错误,这直接导致了CPU和内存耗尽:
s' <- getSocketName s'
这里右边的s'尚未被定义就被使用,属于递归绑定,会让程序陷入无限循环,持续消耗系统资源。
修正后的代码示例
import Network.Wai.Handler.Warp import Network.Socket import System.Exit (exitSuccess) main = do -- 获取inetd传递的已连接套接字(mySocket需正确实现从stdin/stdout获取套接字) s <- mySocket 0 -- 获取套接字的地址,使用已定义的s而非未初始化的s' sockAddr <- getSocketName s -- 配置Warp:处理完连接后自动退出,避免进程残留 let warpSettings = setInstallShutdownHandler (close s >> exitSuccess) defaultSettings -- 运行Warp处理单个连接 runSettingsConnection warpSettings ((, sockAddr) <$> socketConnection warpSettings s) app
关键说明
- 修复变量错误:将
getSocketName s'改为getSocketName s,使用已获取的套接字s来获取地址。 - 设置自动退出:通过
setInstallShutdownHandler配置Warp在连接处理完成后关闭套接字并退出进程,符合inetd的单连接单进程模式。 - 适配inetd模式:inetd会预先接受客户端连接并将套接字传递给子进程,因此无需Warp再监听端口,直接处理已建立的连接即可。
如果需要支持inetd的多连接模式(即单个Warp进程处理多个inetd传递的连接),可以通过监听Unix套接字或手动实现连接循环,但更符合inetd设计的是单连接单进程模式——每个连接启动一个Warp进程,处理完就退出。
内容的提问来源于stack exchange,提问作者William Rusnack
相关产品推荐
相关产品推荐

