如何使用spawn启动Java进程并实时获取stdout输出?
解决Node.js spawn启动Minecraft服务器并捕获输出的问题
问题描述
尝试用Node.js的child_process模块spawn函数启动Minecraft服务器,希望获取进程输出,但当前代码无法实现该需求。
原测试代码
var childP = require("child_process") var server = childP.spawn("java", ["-jar", "Launch.jar", "nogui"]) server.on("spawn", () => { console.log("Server started") }) server.on("message", (message) => { console.log(message) }) server.on("error", (err) => { console.log(err) }) server.on("disconnect", () => { console.log("Server disconnected"); }) server.on("exit", (code) => { console.log(`Server exited with code ${code}`) })
修正后的代码
const childP = require("child_process"); const server = childP.spawn("java", ["-jar", "Launch.jar", "nogui"]); // 监听服务器标准输出 server.stdout.on("data", (data) => { console.log(`[Server] ${data.toString().trim()}`); }); // 监听服务器错误输出 server.stderr.on("data", (data) => { console.error(`[Server Error] ${data.toString().trim()}`); }); server.on("error", (err) => { console.error(`启动失败: ${err.message}`); }); server.on("exit", (code) => { console.log(`服务器退出,代码: ${code}`); });
关键说明
spawn事件不存在,child_process.spawn创建的进程启动后直接执行,无需监听该事件message事件仅适用于IPC进程通信场景(比如fork创建的进程调用send方法),Minecraft服务器的输出是通过stdout/stderr流传递的,需要监听这两个流的data事件- 捕获到的
data是Buffer类型,需用toString()转为字符串,trim()可去除多余换行符 - 区分stdout和stderr,能更清晰地处理正常输出与错误信息
内容的提问来源于stack exchange,提问作者Green Juzzy
相关产品推荐
相关产品推荐

