Node.js因“无条件发送SIGTERM给孩子”而停止

这个问题几乎与
https://www.openshift.com/forums/openshift/nodejs-process-stopping-for-no-reason上发布的问题相同.不幸的是,它仍然没有答案.

今天我的Node.js应用程序停止了几次DEBUG:在日志文件上发送SIGTERM到子…不多也不少.我的应用程序是一个非常简单的单页面应用程序,具有单个AJAX端点,每天提供1k-2k的综合浏览量.它已经运行好几天没有任何问题.

我使用这些模块:

>表达
>身体解析器
>请求
> cheerio

– 更新:

>我正在使用一个小装备. 512MB内存,1 GB存储空间
>摘自日志文件(〜/ app-root / logs / nodejs.log)

Thu Jul 17 2014 09:12:52 GMT-0400 (EDT) <redacted app log message>
Thu Jul 17 2014 09:13:09 GMT-0400 (EDT) <redacted app log message>
Thu Jul 17 2014 09:14:33 GMT-0400 (EDT) <redacted app log message>
DEBUG: Sending SIGTERM to child...
#### below are the log entries after issuing "ctl_app restart"
DEBUG: Running node-supervisor with
DEBUG:   program 'server.js'
DEBUG:   --watch '/var/lib/openshift/redacted/app-root/data/.nodewatch'
DEBUG:   --ignore 'undefined'
DEBUG:   --extensions 'node|js|coffee'
DEBUG:   --exec 'node'
DEBUG: Starting child process with 'node server.js'

>来自oo-cgroup-read的统计数据,如@niharvey所示.有点太长了,所以我把它放在http://pastebin.com/c31gCHGZ.显然我使用了太多的内存:memory.failcnt 40583.我想Node.js会自动(?)重启内存溢出事件,但在这种情况下它不是.我不得不手动重启.
>我忘记了我安装了空闲的MySQL盒式磁带,现在已经删除了.

– 更新#2

该应用程序刚刚再次崩溃. memory.failcnt的值保持不变(http://pastebin.com/LqbBVpV9上的完整统计数据),所以这不是内存问题(?).但是日志文件中存在差异.应用程序似乎重新启动,但失败了.在ctl_app重新启动后,它的工作原理是有意的.

    Thu Jul 17 2014 22:14:46 GMT-0400 (EDT) <redacted app log message>
    Thu Jul 17 2014 22:15:03 GMT-0400 (EDT) <redacted app log message>
    DEBUG: Sending SIGTERM to child...

    ==> app-root/logs/nodejs.log-20140714113010 <==
        at Function.Module.runMain (module.js:497:10)
    DEBUG: Program node server.js exited with code 8
    DEBUG: Starting child process with 'node server.js'
    module.js:340
        throw err;
              ^
    Error: Cannot find module 'body-parser'
        at Function.Module._resolveFilename (module.js:338:15)
        at Function.Module._load (module.js:280:25)
        at Module.require (module.js:364:17)

最佳答案 要在本地计算机上模拟此问题,请在一个终端窗口中使用supervisor运行服务器:

supervisor server.js

然后从另一个终端使用kill命令

kill process_id#

不带参数的kill命令会向应用程序发送SIGTERM消息.如果主管收到SIGTERM,它将立即停止.

OpenShift提供的示例应用程序中的示例代码侦听12个不同的unix信号并退出.可能是OpenShift中的某个人手动终止该进程,因为应用程序没有收听旨在重启它的信号.我正在将此代码添加到我的应用程序中,以查看行为是否更稳定.

function terminator(sig){
  if (typeof sig === "string") {
    console.log('%s: Received %s - terminating sample app ...',
                 Date(Date.now()), sig);
    process.exit(1);
  }     
  console.log('%s: Node server stopped.', Date(Date.now()) );
};

process.on('exit', function() { terminator(); });

['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
 'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
].forEach(function(element, index, array) {
  process.on(element, function() { terminator(element); });
});
点赞