收到第一条消息后,分离节点subprocess

我正在构build一个带有node.js的系统,用户可以从Web界面产生工作进程,而且我在将这两个标准结合起来时遇到了困难:

  1. Web服务器进程和工作进程应该独立运行,这样如果Web服务器崩溃,工作进程不会受到影响。
  2. 母亲进程应该能够从工作进程接收至less一条初始消息。 之后,我想将工作进程的输出logging到文件中。

我已经能够完成这两个标准自己,但不能在一起。 以下是我的代码的相关部分目前的样子:

function spawnWorker (id, callback) { var worker = spawn("node", [require.resolve("worker"), id], { detached: true, stdio: ["ignore", "pipe", "pipe"] }); worker.unref(); var logfile = fs.createWriteStream("foo.log"); worker.stdout.once("data", function (data) { worker.stdout.pipe(logfile); worker.stderr.pipe(logfile); callback(undefined, data.toString()); }); } 

这符合标准2(即它接收到工作人员的第一条消息,并将所有后续输出redirect到一个文件),但是如果我杀死了母进程,那么即使输出已被redirect,工作进程也会被终止。

我的猜测是,这是因为工作人员的stdout和stderr在发送到文件stream之前已经通过pipe道传递给了母亲进程。 如果我在产生stream程时传入stream,根据文档 ,节点将在工作进程中复制该stream:

stream的底层文件描述符在subprocess中被复制[…]

有没有办法在收到第一条消息后,删除母进程和工作进程之间的连接? 或者我应该使用某种types的RPC来完成这个任务,如果是这样的话,那么一旦沟通,这个消息会是一个不错的select?

我解决了这个问题,使用节点的net模块来产生一个随机的端口上的服务器,当它开始的时候传递给工作人员(所以它知道在什么时候发送响应)。

下面是我的解决scheme实施的一个例子,澄清,这符合以下要求:

  1. 保存工作进程的日志输出,
  2. 保持工作stream程脱离母亲stream程(如果后者崩溃,不会影响员工)

server.js

 var net = require("net"), fs = require("fs"), spawn = require("child_process").spawn, randomPort = require("get-port"); randomPort(function (port) { var server = net.createServer(function (connection) { connection.on("data", function (data) { server.close(); /** * Response received from worker, this is where you would put * your logic that returns a response to the client that initiated * the request to the server. */ }); }); server.listen(port); var logfile = fs.createWriteStream("log"); var worker = spawn("node", ["worker.js", port], { detached: true, stdio: ["ignore", logfile, logfile] }); worker.unref(); worker.on("close", function (status, message) { console.log("worker closed", status, message); }); }); 

worker.js

 var net = require("net"); var options = process.argv.slice(2), rpcPort = Number(options[1]); var client = net.connect({port: rpcPort}, function () { client.end(JSON.stringify({started: true}})); });