【问题标题】:Node.js stopped with "Sending SIGTERM to child" for no reasonNode.js 无缘无故停止了“向孩子发送 SIGTERM”
【发布时间】:2014-07-17 14:34:44
【问题描述】:

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

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

我使用这些模块:

  • 快递
  • 正文解析器
  • 请求
  • cheerio

-- 更新:

  1. 我正在使用一个小齿轮。 512MB 内存,1GB 存储空间

  2. 日志文件摘录 (~/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'
    
  3. 来自oo-cgroup-read 的统计数据,由@niharvey 建议。有点太长了,所以我把它放在http://pastebin.com/c31gCHGZ上。显然我使用了太多内存:memory.failcnt 40583。我想 Node.js 会在内存过度使用事件时自动(?)重新启动,但在这种情况下它不是。我不得不手动重启。

  4. 我忘记安装了一个空闲的 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)

【问题讨论】:

  • 尝试 ssh'ing 到您的设备并运行 for i in $(oo-cgroup-read all);do echo "oo-cgroup-read $i" &amp;&amp; oo-cgroup-read $i; done,为了清楚起见,您是否介意将日志发布到您的 ~/app-root/logs 中
  • @niharvey 刚刚在问题中添加了一些细节并运行了您的脚本。
  • 大家都明白了吗?我遇到了类似的问题。
  • 我也遇到了这个问题。
  • 我也是,有人有消息吗? @sandinmyjoints

标签: node.js openshift


【解决方案1】:

要在本地计算机上模拟此问题,请在一个终端窗口中使用主管运行您的服务器:

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); });
});

【讨论】:

  • 这种方法有什么好处吗?
【解决方案2】:

这通常是因为您的应用闲置了。当您 ssh 进入应用程序时,您应该会看到如下内容:

  ***  This gear has been temporarily unidled. To keep it active, access
  ***  your app @ http://abc.rhcloud.com/

您可以尝试使用预定的 ping 来保持应用程序处于活动状态。

【讨论】:

    【解决方案3】:

    我也有同样的问题。我删除了齿轮并创建了一个新的。新的已经运行了几天,似乎没有问题。

    [更新] 几天后,问题出现在我的新装备上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2015-03-25
      • 2021-11-22
      • 2016-01-16
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多