4

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

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

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

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

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

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

那么,是否可以在node中创建一个独立的进程呢?有没有其他建议来处理这个问题?

4

1 回答 1

6

子进程仍然是一个独立的进程,但默认情况下,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流与父流的关联,否则它会保持连接状态。

于 2013-10-09T14:31:11.450 回答