繁体   English   中英

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

[英]Reattaching to spawned process via nodejs

我正在Node.js中创建一个小型的专有游戏服务器管理器; 目前,它是通过child_process来运行游戏:

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

只要管理器继续运行,我就可以通过管道传递命令并按我的意愿处理孩子。 但是,请考虑我的经理崩溃或关闭的可能性。 然后,我如何重新附加到先前生成的子进程(当管理器关闭时该子进程仍在运行)? 我可以存储pidfile尝试并基于pid重新连接; 但是我不确定如何获得一个可以访问子stdio对象的child_process对象。

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


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


编辑

从节点的child_process读取一些源代码后,看起来如果您在名为stdinStreamstdoutStreamstderrStream的选项中指定了属性,则应该打开一个套接字。 (见线428 - 496 )。 因此,问题是,如何停止生成实际生成的Spawn,而是仅基于我通过的指定pid和流来设置其值。 (我将通过执行fs.createWriteStream('/proc/PID/fd/0');获得我的stdinStream fs.createWriteStream('/proc/PID/fd/0');由于将fd创建为管道fs.createWriteStream('/proc/PID/fd/0');该方法应该可以工作。)

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

net服务器和套接字实现了与stdio相同的Readable和Writable Stream接口,因此在设置和连接后,您应该能够像以前一样write(...)pipe()事件。

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

与节点项目上的一些人交谈之后,看来我可以完成此操作的唯一方法是处理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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM