我正在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,而只是根据我传递的指定pid和流设置其值。 (我会通过执行stdinStream
得到我的fs.createWriteStream('/proc/PID/fd/0');
,这应该有用,因为fd是作为管道创建的。)
答案 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');