Node.js 节点ECS任务未崩溃
节点ECS任务未崩溃 我有一个ECS工作程序正在运行节点:Boron(v6.9.0)。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
我偶尔会遇到一个意外的例外情况。
例如:
{
"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不知道的子进程,因此没有崩溃。但我找不到任何关于这种情况的文件。