这个问题与 https://www.openshift.com/forums/openshift/nodejs-process-stopping-for-no-reason 上发布的问题几乎相同。不幸的是,它仍然没有得到答复。
今天,我的 Node.js 应用程序因日志文件中的 DEBUG: Sending SIGTERM to child...
而停止了几次。不多也不少。我的应用程序是一个非常简单的单页应用程序,具有单个 AJAX 端点,每天提供 1k-2k 的综合浏览量。它已经运行好几天了,没有任何问题。
我使用这些模块:
- 更新:
~/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
的 memory.failcnt 40583
。我想 Node.js 会自动(?)在内存过度使用事件中重新启动,但在这种情况下不是。我不得不手动重启。 -- 更新 #2
刚才应用程序又崩溃了。
memory.failcnt
的值保持不变(http://pastebin.com/LqbBVpV9 上的完整统计数据),所以这不是内存问题(?)。但是日志文件中存在差异。该应用程序似乎重新启动,但失败了。在 ctl_app restart
之后,它按预期工作。 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 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); });
});
关于Node.js 无缘无故地用 "Sending SIGTERM to child"停止了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24806442/