Javascript 通过nodejs重新连接到生成的进程

Javascript 通过nodejs重新连接到生成的进程,javascript,node.js,process,stdio,child-process,Javascript,Node.js,Process,Stdio,Child Process,我正在Node.js中创建一个小型专有游戏服务器管理器;目前,它通过child\u进程生成来运行游戏: var server = spawn(cmd, args, { cwd: 'something' }); 只要经理继续运行,我就可以按照自己的意愿执行命令和处理孩子。但是,考虑一下我的经理崩溃或关闭的可能性。然后如何重新连接到先前生成的子进程(在管理器关闭时仍在运行)?我可以存储pid文件以尝试基于pid重新连接;但是我不知道如何获得一个child\u进程对象来访问孩子的stdio对象 我真

我正在Node.js中创建一个小型专有游戏服务器管理器;目前,它通过
child\u进程生成来运行游戏:

var server = spawn(cmd, args, { cwd: 'something' });
只要经理继续运行,我就可以按照自己的意愿执行命令和处理孩子。但是,考虑一下我的经理崩溃或关闭的可能性。然后如何重新连接到先前生成的子进程(在管理器关闭时仍在运行)?我可以存储pid文件以尝试基于pid重新连接;但是我不知道如何获得一个
child\u进程
对象来访问孩子的
stdio
对象

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


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


编辑


从节点的
child\u进程
读取一些源代码后,如果在名为
stdinStream
stdoutStream
stderstream
的选项中指定一个属性,则应该只打开一个套接字。(见第行-)。因此,问题是,如何阻止spawn实际执行spawn,而只是根据指定的pid和我传递的流设置其值。(我将通过执行
fs.createWriteStream('/proc/PID/fd/0');
来获取我的
stdinStream
,因为fd是作为管道创建的。)

要扩展上面评论中的内容,您可以使用每个子进程创建服务器的位置(
net.createServer()
)您保存了一个列表,其中列出了某个位置的哪个端口上的孩子正在侦听什么,然后当您的主机重新启动时,它会找到该列表中的孩子并连接到每个孩子的服务器。从
net.createConnection()
获取的
Sockets
替换主进程中的
子进程对象

net
服务器和套接字实现了与
stdio
相同的可读写接口,因此在设置和连接之后,您应该能够像以前一样写入(…)
pipe()
事件


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

在与node项目的一些人员交谈后,我似乎可以实现这一点的唯一方法是处理proc fs中的原始文件描述符。我可能会模拟类似于
child\u进程的对象,并创建其流,如:

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

嗯,我想知道你是否可以用任何编程语言,更不用说js/node了。如果是我,我会考虑使用套接字来解决这个问题。我通过子进程的
stdin
传递一些命令,由于我对*nix sockets几乎没有经验,我如何才能重新获得连接到孩子的
stdin
的“管道”?有人对此有什么想法吗?不幸的是,这将意味着为我需要运行的每个游戏服务器启动一个节点实例,如果这些孩子中的任何一个崩溃或关闭了,我就在同一条船上。没错,它有很多新的节点实例,但我认为spawn也会这样做。我不想在同一条船上发生碰撞,当然你必须重新启动它,但通过这种方式你可以重新连接现有的东西。你说的是让主节点进程生成子节点进程,并通过套接字与它们通信,这很好,而且是可恢复的。但是,子节点proc将生成其游戏服务器,并通过
stdin
与之通信。因此,如果这个孩子崩溃了,你可以重新连接到一个新的孩子,但这个孩子不能重新连接到游戏服务器,这是整个问题。一个游戏服务器可以是一个java进程,一个源代码专用服务器,任何东西都可以。啊,我想的是纯节点。但是,如果您也在编写游戏代码,网络/套接字的想法可能仍然适用于节点到游戏的通信。如果它必须是stdin,那么我的答案就毫无用处了。这有点超出我的知识范围,但可能有一些有用的信息。这个方法仍然有效吗?我似乎无法让它与节点v0.10一起工作。我正在尝试做一个Minecraft服务器管理员,如果您有任何疑问,我希望了解一些情况。:)我从来没有让它在0.6上100%起作用,所以我放弃了尝试做类似的事情。不幸的是:/Sad day,看起来我可能不得不效仿。你们中的任何一个人有没有再看过这个?重新连接到子进程@多米尼卡恩斯