child_process以代码null退出

enR*_*ser 5 node.js

我在centos6.X中运行我的节点服务器,并分叉子进程.

var cp = require('child_process');
child = cp.fork(__dirname+'/worker');
child.on('exit', function (code, signal) {
            console.log('Child exited with code = ' +code+'  signal = '+signal);
 });
Run Code Online (Sandbox Code Playgroud)

但几秒钟后我收到了这个错误

子代码退出,代码= null signal = SIGKILL

我现在对如何摆脱这一点毫无头绪,没有更多的痕迹,关于发生了什么.

更多澄清

我把console.logs放在worker中,然后打印出来.工作人员正在等待来自主服务器的消息.但是等了几秒钟就退出了.我还使用node命令独立运行worker js,并且它不会退出.

相同的代码在我的本地OSX笔记本电脑上正常工作.但在云centos6.XI面临这个问题.

rob*_*lep 16

子进程可以通过两种方式退出:自愿,在这种情况下,退出代码将通过信号返回或非自愿地返回.

exit处理程序的参数,第一个反映退出代码,第二个反映信号.其中一个将包含一个值,另一个将包含一个值null.如文档所述:

如果进程退出,code则是进程的最终退出代码,否则null.如果由于接收到信号而终止该过程,signal则是信号的字符串名称,否则null.其中一个将始终为非null.

如果您的子进程收到a SIGKILL,并且您不是(明确地)发送该信号的那个进程,那么很有可能子进程被Linux OOM杀手杀死,这会杀死进程,以防系统被内存束缚( "OOM"的意思是"内存不足").

因此,请确保您的系统具有足够的RAM,足够的交换和/或您的进程不会占用太多内存(如果可能).


Kas*_*spi 5

就我而言,运行的进程exec打印了太多输出,并且达到了maxBuffer (请参阅 的maxBuffer选项exec),这导致 NodeJS 通过退出代码与子进程分离null,而子进程继续在后台运行,直到它退出。成功完成。

如果您也是这种情况,解决方案就是简单地增加该maxBuffer选项,默认情况下为 1MB(截至撰写本文时)。

感谢Sathish指出了这一点