从 NodeJs 启动一个独立的进程



我目前正在使用NodeJs Web服务按需运行一些casper.js脚本。因为 casper.js 使用 stdout 作为它回到节点的通信通道,并且节点将 casper 作为子进程运行,所以我不能像对其他节点服务一样使用 nssm 将节点作为 Windows 服务运行,因此它在服务器启动时作为计划任务运行。

这有效,但现在我需要生产此代码,并且确实需要使其对崩溃更具弹性 - 即如果失败,我需要重新启动服务。

据我所知,我的选择是....

  1. 在 linux 盒子上运行节点服务,然后 stdout 在作为守护程序运行时应该可以工作
  2. 以某种方式使Windows服务能够"看到"标准输出
  3. 创建一个单独的节点服务器(在 nssm 下运行(,该服务器可以监视服务并在服务失败时重新启动它

到目前为止,由于额外的托管主机,如果可能的话,我想避免选项一。我找不到任何有助于选项二的东西,看起来 Windows 服务只是不能那样工作。

因此,今天我尝试创建一个监视器服务,如果它没有响应检测信号,则可以重新启动崩溃的服务。问题是我似乎无法弄清楚如何从另一个实例节点中启动完全独立的节点服务器。如果我使用子进程,那么它仍然是服务和标准输出工作的子进程。

那么,是否可以在节点中创建一个独立的进程?还有其他处理此问题的建议吗?

子进程仍然是一个独立的进程,但默认情况下,stdin流仍附加到父进程,因此当父进程死亡时,子进程也会终止。若要避免发生这种情况,请以分离方式运行子进程。下面是文档中的示例:

var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');
var child = spawn('cmd', [], {
  detached: true,
  stdio: [ 'ignore', out, err ]
});
child.unref();

child.unref() 方法用于在其事件循环中删除对子项的引用。这样,父母就不会等孩子退出自己。另请注意,使用 detached 选项时,您仍必须取消子级stdin流与父级的关联,否则它将保持附加状态。

相关内容

最新更新