Node.js使用spawn启动Rust服务端时stdout的data事件不触发如何解决
Rust服务端stdout事件不触发问题修复方案
问题根因
Rust专用服务端基于Unity引擎开发,输出缓冲逻辑会随输出目标变化:
- 输出到终端时默认使用行缓冲,每输出一行就自动刷新缓冲区,因此你可以直接在终端看到运行日志
- 输出到管道(即通过spawn挂载stdout的场景)时默认使用全缓冲,只有缓冲区存满(通常为4KB/8KB)才会向外输出内容,因此
data事件长时间无法触发
修复方法
1. 补充Unity专属启动参数
在启动参数数组最开头新增两个参数,强制日志输出到stdout并禁用缓冲:
-nographics:关闭图形相关初始化,适配无图形环境运行-logfile -:指定日志输出到标准输出流,同时关闭缓冲,输出内容会实时吐出
2. 可选优化配置
spawn配置中的shell: true可以移除,你的启动参数没有shell专属语法,关闭shell可避免中间层导致的额外缓冲问题。
3. 冗余符号清理
现有参数中手动为字符串值添加的双引号可以删除,spawn传递参数数组时会自动处理特殊字符转义,手动加双引号反而可能被服务端识别为参数值的一部分,导致配置不生效。
修复后的核心代码示例
const GAMESERVERARGS: Array<string> = [ "-batchmode", "-nographics", // 新增参数 "-logfile", "-", // 新增参数 "+server.port", `${config.get("Server.port")}`, "+server.level", config.get("Server.level"), // 移除多余双引号 "+server.seed", `${config.get("Server.seed")}`, "+server.worldsize", `${config.get("Server.worldsize")}`, "+server.maxplayers", `${config.get("Server.maxplayers")}`, "+server.hostname", config.get("Server.hostname"), // 移除多余双引号 "+server.description", config.get("Server.description"), // 移除多余双引号 "+server.headerimage", config.get("Server.headerimage"), // 移除多余双引号 "+rcon.port", `${config.get("Rcon.port")}`, "+rcon.password", config.get("Rcon.password"), // 移除多余双引号 "+rcon.web", `${config.get("Rcon.web")}` ]; const gameServerProc : ChildProcessWithoutNullStreams = spawn( GAMESERVERPATH+EXECUTABLE, GAMESERVERARGS, { cwd: GAMESERVERPATH, // 移除shell: true配置 } );
完成以上修改后,stdout的data事件就可以正常实时触发。
内容的提问来源于stack exchange,提问作者Dan-Levi Tømta
相关产品推荐
相关产品推荐

