我想创建一个运行在带有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);
});
答案 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.js
和rabbit.js
以使其按要求工作。诀窍是在ipc
选项中使用stdio
文件描述符。这样,您就可以与孩子的父母沟通。如果标记为fd
,则前三个null
将是默认值。有关更多信息,请参见stdio options docs