从NodeJs开始一个独立的过程

时间:2013-10-09 13:28:27

标签: windows node.js casperjs

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

这有效但现在我需要生成这个代码,并且真的需要让它更能适应崩溃 - 即如果它失败,我需要重启服务。

就我所见,我的选择是....

  1. 在Linux机器上运行节点服务,然后stdout在作为守护程序运行时应该工作
  2. 以某种方式使Windows服务能够“看到”stdout
  3. 创建一个单独的节点服务器(在nssm下运行),可以监视服务并在服务失败时重新启动它
  4. 到目前为止,由于其他托管主机,我希望尽可能避免选项一。我找不到任何有助于选项二的东西,看起来像Windows服务就是这样不起作用。

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

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

1 个答案:

答案 0 :(得分:3)

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