如何在Node JS中保持派生子进程活动

时间:2018-08-21 09:07:30

标签: javascript node.js rabbitmq forever

我想创建一个运行在带有node的foreverjs一样的Rabbitmq cli。它可以产生child_process并使其在后台运行,并且可以随时与child_process通信。我面临的问题是,当主cli程序退出child_process似乎也停止运行时,我尝试使用detached:true和.unref()进行分叉,它不起作用。即使退出父调用方进程后,如何在后台运行子进程?

cli.js-父级

const { fork, spawn } = require('child_process');
const options = {
  stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
  slient:true,
  detached:true
};

child = fork('./rabbit.js', [], options)

child.on('message', message => {
  console.log('message from child:', message);
  child.send('Hi');
  // exit parent
  process.exit(0);
});

child.unref()

rabbit.js-子级 如果启动并正在运行,则“ i”应保持递增状态

var i=0;
i++;
if (process.send) {
  process.send("Hello"+i);
}

process.on('message', message => {
  console.log('message from parent:', message);
});

1 个答案:

答案 0 :(得分:1)

我认为fork没有detached选项。请参阅node docs for fork

如果您使用spawn,则即使父母退出,孩子仍会继续奔跑。我对您的代码做了一些修改,以使用spawn

cli.js

const { fork, spawn } = require('child_process');
const options = {
  slient:true,
  detached:true,
    stdio: [null, null, null, 'ipc']
};

child = spawn('node', ['rabbit.js'], options);
child.on('message', (data) => {
    console.log(data);
    child.unref();
    process.exit(0);
});

rabbit.js

var i=0;
i++;
process.send(i);
// this can be a http server or a connection to rabbitmq queue. Using setInterval for simplicity
setInterval(() => {
    console.log('yash');
}, 1000);

我认为当您使用fork时,在父进程和子进程之间会建立一个IPC channel。您可以尝试在退出父进程之前正常断开IPC channel的连接。我会尝试一下并更新答案(如果可行)。

更新

我已更新cli.jsrabbit.js以使其按要求工作。诀窍是在ipc选项中使用stdio文件描述符。这样,您就可以与孩子的父母沟通。如果标记为fd,则前三个null将是默认值。有关更多信息,请参见stdio options docs