2012-04-11 63 views
7

我在Node.js中创建了一个小型私有游戏服务器管理器;目前,它由通过child_process产卵运行游戏:通过nodejs重新连接产生的进程

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

只要经理继续运行,我能管的命令和处理孩子,我想。但是,请考虑我的经理崩溃或关闭的可能性。我如何重新连接到以前衍生的子进程(当管理者关闭时仍然运行)?我可以存储pidfiles以基于pid尝试重新连接;但我不知道如何获得child_process对象访问该对象的子对象。

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


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


编辑

阅读从节点的child_process一些源代码看起来,如果你指定称为stdinStreamstdoutStream选项的属性,或者stderrStream它应该只是打开一个套接字它像后。 (见行428 - 496)。所以问题是,我怎么停止产生实际上做一个产卵,而是只是基于指定的PID和我通过的流设置其值。 (我会得到我的stdinStreamfs.createWriteStream('/proc/PID/fd/0');它应该工作,因为这FD作为一个管道创建。)

+2

hmm。我不知道你是否可以用任何编程语言来做到这一点,更不用说js/node了。如果是我,我会看看使用套接字来解决这个问题 – ControlAltDel 2012-04-11 19:48:58

+0

我通过子进程的stdin传递一些命令,因为我几乎没有使用* nix套接字的经验,我怎么才能完成重新获得'管道'到孩子的“stdin”? – Chad 2012-04-11 21:05:40

+0

任何人对此有任何想法? – Chad 2012-04-15 17:17:04

回答

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

这种方法仍然有效吗?我似乎无法让它与Node v0.10一起工作。我正在尝试创建一个Minecraft服务器管理员,如果您有任何问题,请提供一些见解。 :) – 2013-05-14 04:49:21

+0

我从来没有得到这个在0.6上工作100%,所以我放弃了试图做这样的事情不幸:/ – Chad 2013-05-24 16:49:51

+0

悲伤的一天,看起来我可能不得不效仿。 – 2013-05-24 17:29:49

1

要扩展什么,有人说在上面留言,您可以使用http://nodejs.org/api/net.html其中每个子进程创建一个服务器(net.createServer()),并且您保存了哪些孩子在某处的哪些端口监听的列表,然后当您的主站重新启动时,该列表会找到该孩子列表并连接到每个服务器。您从net.createConnection()获得的Sockets将取代主人中的child_process对象。

net服务器和插座实现相同的读取和写入Stream接口,stdio,所以设置和连接之后,你应该能够write(...)pipe()事件,就像你一直在做。

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

+0

不幸的是,这意味着要为每个需要运行的游戏服务器启动一个节点实例,并且如果这些孩子中的任何一个发生故障或关闭,我就在同一条船上。 – Chad 2012-04-12 10:13:54

+0

没错,它有很多新的节点实例,但我认为产卵也是如此。如果一个人崩溃,我不会跟随在同一条船上,当然你必须重新启动它,但这样你可以重新连接现有的东西。 – 2012-04-12 17:35:41

+0

你说的是有一个主节点proc产卵子节点procs并通过套接字与他们沟通,这是很好的和可恢复的。但是* child * node proc会产生它的游戏服务器并通过'stdin'与它通信。因此,如果该*孩子*崩溃,您可以重新连接到一个新的孩子,但该孩子无法重新连接到游戏服务器,这是整个问题。游戏服务器可以是一个java进程,一个源专用服务器,任何事情都可以。 – Chad 2012-04-12 21:30:28

相关问题