最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

运维笔记admin8浏览0评论

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

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

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

Ruby脚本一次又一次地失败(通常是由于与远端断开连接),而Node脚本将继续运行,显然不知道生成的Ruby脚本已经死亡。

有没有什么方法可以自动从Node或Ruby中恢复生成的Ruby脚本,我不需要重新启动整个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套接字上的连接客户端输出故障通知。

现在我为什么决定自动重新生成脚本是一个坏主意...到目前为止,我的大部分潜在问题引起了上流,我可能会得到一些无效的数据,这会阻碍我的脚本(我知道我应该处理其他地方,但我对此有点新鲜!)或由我引起的肥胖问题!

如果脚本由于来自上游的一些无效数据而死亡,则没有大量工作,它将简单地尝试重新连接以一遍又一遍地消耗相同的坏数据,直到脚本被阻止连续连接然后断开与消息传递服务器的连接。

如果它是由一个胖的变量名称引起的事情,就像一个不常被调用的坏变量名称,那么我会遇到与上面相同的问题,但它最终会导致运行此脚本的本地服务器而不是消息服务器。无论哪种方式,这些结果都不是一个好方法!

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

希望这种洞察能够帮助其他人。

发布评论

评论列表(0)

  1. 暂无评论