最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

为什么父进程在运行分离的子进程后不会自动退出?

运维笔记admin13浏览0评论

为什么父进程在运行分离的子进程后不会自动退出?

为什么父进程在运行分离的子进程后不会自动退出?

Node.js 8.9.1,Linux版本4.10.0-42-通用

const { fork } = require('child_process');

const forked = fork('child.js', {
  detached: true,
  stdio: 'ignore'
});

const config = {
  name: 'trex',
  interval: 2000
};

forked.send(config);
forked.unref();

for (let i = 0; i < 3; i++) {
  console.log('do staff');
}

儿童

const work = function() {
  let sum = 0;
  for (let i = 0; i < 1e10; i++) {
    sum += i;
  }
};

const start = function(config) {
  setTimeout(function run() {
    work();
    setTimeout(run, config.interval);
  }, config.interval);
};

process.on('message', function(config) {
  start(config);
});

我需要父母启动孩子并正常退出。现在,如果我执行node parent.js,我看到父母仍在运行。

trex@beast-cave:~/dev/$ ps aux | grep -e "parent\|child" | grep node
trex      5134  0.0  0.1 874016 29460 pts/11   Sl+  10:44   0:00 node parent.js
trex      5140 86.3  0.1 874108 30252 ?        Rsl  10:44   4:59 /home/trex/.nvm/versions/node/v8.9.1/bin/node child.js

我知道有process.exit()。但为什么它不能正常退出?在我的app中,parent位于setTimeout循环中,有很多逻辑,它必须在一段时间内只运行一次。

回答如下:

来自https://nodejs/api/child_process.html文档:

subprocess.disconnect()#添加于:v0.7.2关闭父级和子级之间的IPC通道,允许子级在没有其他连接保持活动状态时正常退出。调用此方法后,父级和子级(分别)中的subprocess.connected和process.connected属性将设置为false,并且将无法再在进程之间传递消息。

当接收过程中没有消息时,将发出'disconnect'事件。这通常会在调用subprocess.disconnect()后立即触发。

请注意,当子进程是Node.js实例(例如,使用child_process.fork()生成)时,可以在子进程内调用process.disconnect()方法以关闭IPC通道。

const work = function() {
  let sum = 0;
  for (let i = 0; i < 1e10; i++) {
    sum += i;
  }
};

const start = function(config) {
  setTimeout(function run() {
    work();
    setTimeout(run, config.interval);
  }, config.interval);
};

process.on('message', function(config) {
  start(config);
  process.disconnect();
});
发布评论

评论列表(0)

  1. 暂无评论