如何关闭 node.js 中子进程的 stdio 管道?

Posted

技术标签:

【中文标题】如何关闭 node.js 中子进程的 stdio 管道?【英文标题】:How to close the stdio pipes of child-processes in node.js? 【发布时间】:2016-02-12 08:23:47 【问题描述】:

我需要从 node.js 生成一个子进程并观察其标准输出一段时间,然后关闭管道(以便节点进程可以终止)。

这是我的基本代码(不会终止节点进程):

const childProcess = require("child_process");
const child = childProcess.spawn("httpserver");

child.stdout.on("data", (data) => 
  console.log("child> " + data);
  // Disconnect Now ... How?
);

我已经尝试过以下方法:

使用detached:true 选项并调用child.unref() 删除“数据”侦听器

进行了上述更改但仍然不起作用的代码:

const child = childProcess.spawn("httpserver", [], detached: true);
child.stdout.on("data", function cb(data) 
  console.log("child> " + data);
  child.stdout.removeListener("data", cb);
);

child.unref();

还有其他方法可以关闭stdout 管道并断开与子进程的连接吗?


有点相关:文档中提到了一个child.disconnect() API,但是当我在上面使用它时,我得到一个函数未找到错误。它是在这里使用的正确 API,为什么在我的情况下不可用?

【问题讨论】:

这可以帮助***.com/questions/20187184/… @BipBip 我不想杀死子进程。我需要保持它运行并从中“分离”节点进程。 【参考方案1】:

这个对我有用。

const fs = require('fs');
const spawn = require('child_process').spawn;
const out = fs.openSync('./out.log', 'a');
const err = fs.openSync('./out.log', 'a');

const child = spawn('prg', [], 
   detached: true,
   stdio: [ 'ignore', out, err ]
);

child.unref();

https://nodejs.org/api/child_process.html#child_process_options_detached

【讨论】:

这行得通,谢谢!一个小问题是监视文件的更改在操作系统和文件系统之间是不可靠的。但这是探索更多内容的良好起点。再次感谢。

以上是关于如何关闭 node.js 中子进程的 stdio 管道?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Node.js 作为后台进程运行并且永不死亡?

如何将 node.js 服务器作为守护进程启动?

关闭 MySQL 后 Node.js 进程无法恢复,然后再打开

Node Js和Angular中每个进程的实时通知[关闭]

node.js项目通过pm2以守护进程方式运行

当服务器关闭/崩溃时,Node JS 会自动重启所有永远的 JS 进程