产生node.jssubprocess导致云代工中的僵尸进程

我有一个node.js应用程序,我想使用下面列出的代码产生subprocess。

当我在本地运行这个应用程序时,每个'ps'命令很好地触发closures和退出事件。 然而,在我们的云代工(pivotal.io)应用程序中,stdout.close被触发,但subprocess本身的“closures”和“退出”事件决不会发生。 此外,这些进程在内存中保持为僵尸进程(因此~500请求服务器死于E_SPAWN错误)。 所以似乎node.js进程句柄中的退出处理程序从不触发,导致subprocess的退出代码不被读取。

这可以涉及到容器监督,cgroups? 有没有人有这个解决scheme,或者至less遇到同样的问题?

testing代码:

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 

UPDATE

请参阅注释以获得解决方法:使用以“true”开头的自定义启动命令,例如cf push myapp -c 'true;node index.js'

你不会杀死你的subprocess,所以他们像僵尸一样出去玩。 杀死你的僵尸,杀死你的孩子(是的,这听起来很奇怪)..

 child.on('exit', function() { console.log('exit'); res.send("\n<br>EXIT"); child.kill(); });