Ho un'app node.js e voglio generare processi figlio utilizzando il codice elencato di seguito.spawning I processi figlio node.js risultano nei processi zombi su cloud fonderia
Quando eseguo questa app localmente, ognuno dei comandi "ps" attiva correttamente gli eventi di chiusura e di uscita. Tuttavia, sulla nostra applicazione cloud foundry (pivotal.io), viene avviato lo stdout.close, ma gli eventi "close" e "exit" del processo figlio non vengono mai eseguiti. Inoltre, i processi rimangono come processi zombi in memoria (quindi dopo ~ 500 richiesta il server muore su un errore E_SPAWN). Sembra quindi che il gestore di uscita nell'handle del processo node.js non venga mai attivato, determinando la mancata lettura del codice di uscita del processo figlio.
Può riferirsi al guardiano del contenitore, cgroups ...? Qualcuno ha una soluzione per questo o almeno ha incontrato lo stesso problema?
Il codice di prova:
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();
Esempio ps aux
uscita:
<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
Vedere i commenti per una soluzione: usare il comando avviare una personalizzato inizia con 'true;' , per esempio. cf push myapp -c 'true;node index.js'
Un problema simile è descritto in: https://www.pivotaltracker.com/story/show/83352380.The aggirare è non affidarsi a 'npm start' per avviare il processo, ma piuttosto fornire un comando di avvio personalizzato al contenitore CF che inizia con 'true;', ad esempio 'cf push myapp -c 'true; node index.js'' – mweststrate
Ecco un'eccellente spiegazione su cosa sta succedendo: https://groups.google.com/a/cloudfoundry.org/forum/#!topic/vcap-dev/NrlPuBQBkic – Johannes