Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么父进程不';运行分离的子级后是否自动退出?_Javascript_Node.js_Child Process - Fatal编程技术网

Javascript 为什么父进程不';运行分离的子级后是否自动退出?

Javascript 为什么父进程不';运行分离的子级后是否自动退出?,javascript,node.js,child-process,Javascript,Node.js,Child Process,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(

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');
}
我知道有
process.exit()
。但是为什么它不能正常退出呢?在我的应用程序中,父应用程序位于
setTimeout
循环中,有很多逻辑,必须在一段时间间隔内只运行一次。

来自文档:

子流程断开()#添加到:v0.7.2关闭IPC通道 在父级和子级之间,允许子级优雅地退出一次 没有其他连接使其保持活动状态。打了这个电话之后 方法中的subprocess.connected和process.connected属性 父项和子项(分别)都将设置为false,并且 将不再能够在进程之间传递消息

当系统中没有消息时,将发出“断开连接”事件 接受被接受的过程。这通常会被触发 调用subprocess.disconnect()后立即执行

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

const work=function(){
设和=0;
for(设i=0;i<1e10;i++){
总和+=i;
}
};
const start=函数(配置){
setTimeout(函数运行(){
工作();
setTimeout(运行,配置间隔);
},config.interval);
};
process.on('message',函数(config){
启动(配置);
process.disconnect();
});

使用
forked.unref()
,在您的
forked.send()
@Keith尝试后,尽管如此,父级仍在运行。只是在windows中尝试了一下,似乎可以正常工作,您仍然得到了
分离:true
?。。您也可以尝试->
stdio:“忽略”
,以防stdio保留引用内容。@Keith是的,我仍然使用
分离
选项,没有成功。查找问题中的代码更新。只需复制粘贴的代码并重试,将
do staff
控制台记录3次,然后返回控制台。而子进程仍在运行,占用了相当多的CPU。我在节点版本
v8.9.0
,。。窗户。。看一下文档,Linux和windows之间有一些细微的差别,所以可能有一些差别。所以另一个想法是,也许这是IPC通道在Linux中的工作方式,也许试着不要使用
forked.send()
,看看它是否仍然存在。。如果可行,可以使用参数而不是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);
});
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
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();
});