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

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

我使用这些模块:

  • express
  • 正文解析器
  • 请求
  • 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 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/

    10-11 11:56