Node.js 8.9.1,Linux版本4.10.0-42-generic
父
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
循环内,有很多逻辑,并且必须在一段时间内只运行一次。
答案 0 :(得分:2)
来自https://nodejs.org/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();
});