从 NodeJs 开始一个独立的进程

Ric*_*ews 4 windows node.js casperjs

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

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

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

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

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

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

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

hex*_*ide 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();
Run Code Online (Sandbox Code Playgroud)

child.unref()方法用于在其事件循环中删除对子项的引用。这样,父母就不会为了退出自己而等待孩子退出。另请注意,当您使用该detached选项时,您仍然必须将子stdin流与父流分离,否则它会保持连接状态。