通过nodejs重新附加到产生的进程

我正在Node.js中创build一个小型私有游戏服务器pipe理器; 目前它通过child_process产生游戏来运行游戏:

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

只要经理继续跑,我可以pipe命令,并按我的意愿处理孩子。 但是,考虑我的经理崩溃或closures的可能性。 那么我如何重新连接到之前产生的subprocess(在经理closures时仍然在运行)呢? 我可以存储pidfiles来尝试重新连接基于pid; 但我不知道如何获得一个child_process对象访问子的stdio对象。

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


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


编辑

从节点的child_process读取一些源代码后,看起来像是在stdinStreamstdoutStreamstderrStream选项中指定了一个属性,它应该只是打开一个套接字。 (见428-496行)。 所以问题是,我怎么停止产卵实际上做一个产卵,而只是设置基于指定的PID和我传递的stream的值。 (我会通过做fs.createWriteStream('/proc/PID/fd/0');得到我的stdinStream fs.createWriteStream('/proc/PID/fd/0');这应该工作,因为该fd被创build为一个pipe道。

要扩展某人在上面的评论中所说的内容,您可以使用http://nodejs.org/api/net.html ,其中每个subprocess创build一个服务器( net.createServer() ),并且保留一个列表孩子们正在监听某个地方的哪个端口,然后当您的主站重新启动时,它会发现这个孩子列表并连接到他们的服务器。 您从net.createConnection()获取的Sockets将replacemaster中的child_process对象。

net服务器和套接字与stdio实现相同的可write(...) stream接口,所以在build立和连接之后,应该可以像以前一样write(...)pipe()事件。

这可能不是最好的解决scheme,但我相信它会起作用。

在与节点项目中的一些人交谈之后,看起来我能完成这个任务的唯一方法就是处理proc中的原始文件描述符。 我可能会模拟类似于一个child_process对象,并创build它的stream如:

 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');