Node.js 节点ECS任务未崩溃

Node.js 节点ECS任务未崩溃,node.js,docker,amazon-ecs,Node.js,Docker,Amazon Ecs,节点ECS任务未崩溃 我有一个ECS工作程序正在运行节点:Boron(v6.9.0)。 我偶尔会遇到一个意外的例外情况。 例如: { "date": "Mon Jul 03 2017 09:09:29 GMT+0000 (UTC)", "process": { "pid": 28, "uid": 0, "gid": 0, "cwd": "/usr/src/app", "execPath": "/usr/local/bin/node", "version": "v6

节点ECS任务未崩溃

我有一个ECS工作程序正在运行节点:Boron(v6.9.0)。
我偶尔会遇到一个意外的例外情况。
例如:

{
  "date": "Mon Jul 03 2017 09:09:29 GMT+0000 (UTC)",
  "process": {
  "pid": 28,
  "uid": 0,
  "gid": 0,
  "cwd": "/usr/src/app",
  "execPath": "/usr/local/bin/node",
  "version": "v6.11.0",
  "argv": [
    "/usr/local/bin/node",
    "/usr/src/app/src/poll.js"
  ],
  "memoryUsage": {
    "rss": 67502080,
    "heapTotal": 33660928,
    "heapUsed": 25145608,
    "external": 8981275
  }
},
{
  "os": {
    "loadavg": [
      0.65869140625,
      0.44921875,
      0.4541015625
    ],
    "uptime": 218908
  },
  "trace": [
    {
      "column": null,
      "file": null,
      "function": "Error",
      "line": null,
      "method": null,
      "native": true
    }
  ],
  "stack": [
    "Error: ENOENT: no such file or directory, open 'FILE.EXE'",
    " at Error (native)"
  ],
  "level": "error",
  "message": "uncaughtException: ENOENT: no such file or directory, open 'FILE.EXE'",
  "message": "uncaughtException: ENOENT: no such file or directory, open 'FILE.EXE'",
  "timestamp": "2017-07-03T09:09:29.645Z"
}
我希望应用程序崩溃,重新启动,稍后再试。如果它不能处理x次,它就会进入死信队列

问题是,它只是挂起,当我在ECS中查看任务时,它说“正在运行”

因此,它不会重新启动,因为它不会崩溃


我需要做什么配置才能让Node Docker应用程序在未捕获异常时崩溃

将其放入脚本中:

process.on('uncaughtException', function (err) {
    process.exit(1)
})

这是一段失败的代码:

try {
  const file = fs.ReadStream(filepath);
  file.on('data', (d) => {
    task();
  }).on('end' () => {
    task();
  }
} catch (e) {
  logger.FATAL(err, {backtrace: err.stack}, () => process.exit(1));
}
感谢@AndyShinn,我为错误事件添加了一个侦听器:

.on('error', () => process.exit(1))
现在一切都好了


因此,通过添加一个显式错误监听器,它是固定的

此错误的代码路径是什么样子的?是否可能代码正在分叉进程,而ECS没有看到来自同级进程的退出代码?可能。。。这个特定的失败是在文件解压缩时发生的,因此使用
require('child_process').exec('unzip…')
@AndyShinnI会说这是一个代码问题,而不是ECS或Docker的问题。ECS使用Docker运行容器,Docker只知道父进程。如果它分叉额外的进程,并且代码没有通过退出专门处理失败,那么它将不知道它,因此,什么也不会发生。很抱歉,这是一个谎言,(facepalm)。它在
try{const file=fs.ReadStream(filepath);//redac}catch(e){logger.FATAL(err,{backtrace:err.stack},()=>process.exit(1));}
@andyshinn上失败,但代码是从
poll.js
中的初始进程派生出来的吗?如果是这样,Docker仍然看不到退出代码,除非代码以某种方式通过树将其传播回去。所以,这很有趣,因此,打印堆栈跟踪并退出是默认操作。@cameck可能是Docker版本重写了此操作?我不这么认为,更可能的情况是Docker不知道某个子进程失败。因此,似乎创建了Docker不知道的子进程,因此没有崩溃。但我找不到任何关于这种情况的文件。