mwe*_*ate 12 child-process node.js cloud-foundry
我有一个node.js应用程序,我想使用下面列出的代码生成子进程.
当我在本地运行此应用程序时,每个'ps'命令都可以很好地触发关闭和退出事件.然而,在我们的云代工厂(pivotal.io)应用程序中,触发了stdout.close,但子进程的"关闭"和"退出"事件本身从未发生过.此外,进程仍然作为内存中的僵尸进程(因此在~500请求之后服务器因E_SPAWN错误而死亡).因此,似乎永远不会触发node.js进程句柄中的退出处理程序,从而导致未读取子进程的退出代码.
这可能与容器监狱长,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();
Run Code Online (Sandbox Code Playgroud)
示例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
Run Code Online (Sandbox Code Playgroud)
UPDATE
请参阅注释以获取解决方法:使用以"true;"开头的自定义启动命令,例如 cf push myapp -c 'true;node index.js'
您没有杀死您的子进程,因此它们会像僵尸一样闲逛。通过杀死你的孩子来杀死你的僵尸(是的,这听起来很奇怪)..
child.on('exit', function() {
console.log('exit');
res.send("\n<br>EXIT");
child.kill();
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2035 次 |
最近记录: |