【发布时间】:2014-12-09 14:21:58
【问题描述】:
我有一个 node.js 应用程序,我想使用下面列出的代码生成子进程。
当我在本地运行这个应用程序时,每个“ps”命令都会很好地触发关闭和退出事件。然而,在我们的 Cloud Foundry (pivotal.io) 应用程序中,stdout.close 被触发,但子进程本身的“关闭”和“退出”事件永远不会发生。此外,这些进程在内存中仍然是僵尸进程(因此在约 500 次请求后,服务器因 E_SPAWN 错误而死机)。所以看起来node.js进程句柄中的exit handler从来没有被触发,导致子进程的exit code没有被读取。
这可能与容器管理员、cgroups...有关吗?有没有人对此有解决方案或至少遇到过同样的问题?
测试代码:
var cp = require('child_process');
//..create express app
app.get('/foo/', function(req, res, next) {
var child = cp.spawn("ps",["aux"]);
child.stderr.pipe(process.stderr);
child.stdout.on('data', function(data) {
console.log('data');
res.send("\n<br>OUT" + data.toString());
});
child.stdout.on('close', function() {
console.log('close stdout');
res.send("\n<br>CLOSE STDOUT");
});
child.on('close', function() {
console.log('close');
res.send("\n<br>CLOSE");
});
child.on('exit', function() {
console.log('exit');
res.send("\n<br>EXIT");
});
});
app.listen();
ps aux 输出示例:
<br>OUTUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1124 308 ? S<s 14:15 0:00 wshd: 189gaonkujh
vcap 31 0.2 0.0 602676 21692 ? S<sl 14:15 0:00 node index.js 1234
vcap 33 0.0 0.0 0 0 ? Z< 14:17 0:00 [ps] <defunct>
vcap 34 0.0 0.0 15332 1172 ? R< 14:17 0:00 ps aux
更新
查看 cmets 以获得解决方法:使用以“true;”开头的自定义启动命令,例如cf push myapp -c 'true;node index.js'
【问题讨论】:
-
类似的问题描述在:pivotaltracker.com/story/show/83352380.The 解决方法是不依赖 'npm start' 来启动进程,而是向 CF 容器提供一个以 'true 开头的自定义启动命令;',例如
cf push myapp -c 'true;node index.js'
标签: node.js cloud-foundry child-process