ruby - 当失败时自动从 node.js 中重新生成 ruby​​ 脚本

标签 ruby node.js

我有一个 Node.js 应用程序,启动时会生成一个 Ruby 脚本来连接到流数据服务并通过 STDOUT 捕获输出,然后通过 websocket 向客户端提供服务。

Ruby 脚本时不时会失败(通常是由于与远端断开连接),而 Node 脚本将继续运行,但它显然不知道生成的 Ruby 脚本已经终止。

有什么方法可以从 Node 或 Ruby 中自动恢复生成的 Ruby 脚本,而无需重新启动整个 Node 实例(因此不会启动客户端)并且脚本将重新生成并附加到正确的 Node 实例?

该脚本是使用以下内容生成的;

var cp = require('child_process');
var tail = cp.spawn('/var/www/html/mapper/test/feed1-db.rb');

tail.stdout.on('data', function(chunk) {
#<more stuff here where data is split and emitted from the socket>#

最佳答案

我终于有更多的时间来研究这个问题,并决定自动重新生成失败的脚本可能是一个非常糟糕的主意! (稍后详细介绍)

我发现我可以使用以下命令捕获子进程的错误和退出;

tail.on('exit', function (code) {
 console.log('child process exited with code ' + code);
});

这将为我提供子脚本的退出代码。

我还发现我可以使用以下命令捕获任何其他错误;

tail.stderr.on('data', (data) => {
    console.error(`child stderr:\n${data}`);
});

这两个错误都会输出到控制台,这意味着您仍然可以回溯任何问题。我还扩展了错误检测的代码,以向 Web 套接字上连接的客户端输出失败通知。

现在解释一下为什么我认为自动重新生成脚本是一个坏主意...... 到目前为止,我的大多数潜在问题都是在上游引起的,我可能会得到一些无效数据,这些数据会阻塞我的脚本(我知道我应该在其他地方处理这个问题,但我对此有点陌生!)或由我引起的粗手指问题!

如果脚本由于来自上游的一些无效数据而死亡,则无需做大量工作,它只会尝试重新连接以一遍又一遍地使用相同的错误数据,直到脚本被阻止连续连接然后与消息传递服务器断开连接。

如果这是由一个笨拙的时刻引起的,比如一个不经常被调用的错误变量名,那么我会遇到与上面相同的问题,但它最终可能会导致运行此脚本的本地服务器而不是消息传递服务器崩溃。无论哪种方式,这两种结果都不是一个好方法!

除非您捕获非常具体的退出代码或您知道不会“造成损害”的故障,否则我不会走这条路。上面的两个代码块至少允许我捕获退出/错误并通知某人,以便他们可以进行干预并查看是什么触发了它。这也意味着我的在线用户意识到后台故障,他们可能会看到看似有效但实际上并未更新的数据。

希望这种见解对其他人有帮助。

关于ruby - 当失败时自动从 node.js 中重新生成 ruby​​ 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26721087/

相关文章:

ruby-on-rails - 为什么这个代码块在 Rails.cache.fetch 之后执行

ruby - Compass/SASS 中缺少依赖项

ruby - 如何使用 Savon 将属性添加到 header 标签?

ruby - 使用 thin & eventmachine 的 HTTP 流式传输

node.js - Node js 解析外来字符

javascript - 实际情况下的异步请求处理如何工作?

ruby - 将带括号的字符串转换为树,Ruby

node.js - 有人将 Node.js 与 Amazon SNS 和 Apple 推送通知一起使用吗?

node.js - 为什么运行npm install时npm-shrinkwrap.json会更改

node.js - 在azure上部署React应用程序