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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:54:05