通过nodejs重新连接生成进程

时间:2012-04-11 19:43:39

标签: javascript node.js process stdio child-process

我正在Node.js中创建一个小型专有游戏服务器管理器;目前它通过child_process产生游戏:

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

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

我真的希望这是可以恢复的;感谢任何帮助,谢谢!


请注意:游戏服务器是专有的,一些例子是Minecraft,Source DS等。假设我无法访问服务器源。


修改

从节点child_process读取一些源代码后,如果您在名为stdinStreamstdoutStreamstderrStream的选项中指定属性,它应该只是打开一个插座到它。 (见428行 - 496)。那么问题是,我如何停止从实际生成一个spawn,而只是根据我传递的指定pid和流设置其值。 (我会通过执行stdinStream得到我的fs.createWriteStream('/proc/PID/fd/0');,这应该有用,因为fd是作为管道创建的。)

2 个答案:

答案 0 :(得分:1)

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

net服务器和套接字实现与stdio相同的可读和可写Stream接口,因此在设置和连接后,您应该能够write(...)和{{像你一直在做的事件。

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

答案 1 :(得分:0)

在与节点项目中的一些人交谈后,看起来我能够完成此任务的唯一方法是处理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');