9

我正在 Node.js 中创建一个小型专有游戏服务器管理器;目前它通过生成通过以下方式运行游戏child_process

var server = spawn(cmd, args, { cwd: 'something' });

只要经理继续运行,我就可以管道命令并按照我的意愿处理孩子。但是,请考虑我的经理崩溃或关闭的可能性。然后我将如何重新连接 到先前生成的子进程(在管理器关闭时仍在运行)?我可以存储 pidfiles 以尝试基于 pid 重新连接;但我不确定如何获取可以child_process访问孩子对象的stdio对象。

我真的希望这是可以恢复的;任何帮助表示赞赏,谢谢!


请注意:游戏服务器是专有的,例如 Minecraft、Source DS 等。假设我无权访问服务器源。


编辑

从节点读取一些源代码后child_process,看起来如果您在名为stdinStream,的选项中指定了一个属性stdoutStream,或者stderrStream它应该只打开一个套接字。(见第428 - 496行)。所以问题是,我如何阻止 spawn实际执行 spawn,而只是根据指定的 pid 和我传递的流设置其值。(由于 fd 是作为管道创建的,所以我会stdinStream通过这样做来获得我的结果。)fs.createWriteStream('/proc/PID/fd/0');

4

2 回答 2

1

为了扩展上面评论中的内容,您可以使用http://nodejs.org/api/net.html每个子进程创建一个服务器(net.createServer()端口,然后当您的主服务器重新启动时,它会查找该子列表并连接到每个服务器。Sockets您从中获得的替换net.createConnection()child_process的主人中的对象。

net服务器和套接字实现与 相同的 Readable 和 Writable Stream接口stdio,因此在设置和连接之后,您应该能够像您一直在做的那样处理事件write(...)pipe()

这可能不是最好的解决方案,但我相信它会奏效。

于 2012-04-11T22:43:39.180 回答
0

在与 node 项目中的一些人交谈之后,看起来我能做到这一点的唯一方法是处理 proc fs 中的原始文件描述符。我可能会模拟类似于child_process对象的东西并创建它的流,例如:

var child = {};
child.stdin = fs.createWriteStream('/proc/PID/fd/0');
child.stdout = fs.createReadStream('/proc/PID/fd/1');
child.stderr = fs.createReadStream('/proc/PID/fd/2');
于 2012-04-23T12:37:42.693 回答