如何关闭通过Node.js spawn()创建的Minecraft服务器进程?
解决Node.js中Minecraft服务器无法通过kill()关闭的问题
你遇到的问题是因为kill()仅终止了启动Minecraft服务器的父Java进程,实际运行服务器的是它的子进程,所以父进程被终止后子进程仍会持续运行。正确的做法是通过Minecraft服务器控制台发送/stop命令,让服务器优雅地自行关闭。
实现方法
通过Node.js进程的stdin向Minecraft服务器写入/stop命令,注意必须加上换行符(\n)——服务器控制台需要回车触发命令执行:
// 在需要关闭服务器的位置执行 mcserver.process.stdin.write('/stop\n');
完整示例(含错误处理)
为避免写入失败(比如进程已结束),可以添加简单的错误处理逻辑:
// 创建服务器进程的代码保持不变 mcserver.process = spawn("java", [ "-Xmx1024M", "-Xms1024M", "-jar", "server.jar", "nogui"], { cwd: mcserver.dir, } ); mcserver.process.on("exit", () => { console.log("minecraft server exit lol"); }); // 监听stdin写入错误,避免异常抛出 mcserver.process.stdin.on('error', (err) => { console.error('写入关闭命令失败:', err); }); // 封装关闭服务器的函数 function stopMcServer() { if (mcserver.process && mcserver.process.stdin.writable) { mcserver.process.stdin.write('/stop\n'); console.log('已向服务器发送关闭命令'); } else { console.log('服务器进程已关闭或无法写入命令'); } } // 在需要的地方调用该函数即可 // stopMcServer();
发送/stop命令后,Minecraft服务器会自动保存数据并终止所有相关进程,不会出现残留进程的问题。
内容的提问来源于stack exchange,提问作者arthurgps2
相关产品推荐
相关产品推荐

