【问题标题】:Start an independent process from NodeJs从 NodeJs 开始一个独立的进程
【发布时间】:2013-10-09 13:28:26
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: windows node.js casperjs


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2012-07-20
      • 1970-01-01
      相关资源
      最近更新 更多