Javascript 如何在节点js中保持分叉子进程的活动状态

Javascript 如何在节点js中保持分叉子进程的活动状态,javascript,node.js,rabbitmq,forever,Javascript,Node.js,Rabbitmq,Forever,我想创建一个rabbitmq cli,它像foreverjs一样使用node运行。它可以生成child_进程并使其在后台运行,并且可以随时与child_进程通信。我面临的问题是,当主cli程序退出时,child_进程似乎也停止运行,我尝试使用detached:true和.unref()分叉,但它不起作用。即使在父调用方进程退出后,如何在后台运行子进程 cli.js-父级 const { fork, spawn } = require('child_process'); const options

我想创建一个rabbitmq cli,它像foreverjs一样使用node运行。它可以生成child_进程并使其在后台运行,并且可以随时与child_进程通信。我面临的问题是,当主cli程序退出时,child_进程似乎也停止运行,我尝试使用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-child 如果它启动并运行,“i”应该继续递增

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

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

我认为
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);
});
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);
rabbit.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);
});
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通道。在退出父进程之前,您可以尝试优雅地断开IPC通道的连接。我会尝试一下,如果有效,我会更新答案

更新:


我已经更新了
cli.js
rabbit.js
,让它按要求工作。诀窍是在
stdio
选项中使用
ipc
文件描述符。这样你就可以从孩子身上与父母沟通。如果标记为
null
,则前三个
fd
s将是默认值。有关更多信息,请参阅

如果这样做有效,我仍然可以通过消息回调与子进程通信吗?我不这么认为。特定于
fork
的通信。您可能必须找到另一种与子进程通信的方法。如果它将子对象的stdio重定向到父对象,那么可以使用
spawn
完成。但是,我想,IPC这种消息传递方式是不可能实现的。在这种情况下,pm2或永远都无法实现这种功能。就像永远开始一样,进程被带到后面,并且可以通过某种进程id停止相应的操作?这可以通过spawn完成,对吗?使用spawn启动子进程,然后杀死父进程。那孩子还在跑吗
forever
可能会将
stdio
stderr
通过管道传输到父进程,这可以通过
spawn
实现。是否可以编写一个小代码片段,显示在nodejs中使用哪种方法来实现这一点?对不起,我很痛苦