这个问题几乎与
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); });
});