2014-12-09 10 views
9

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'

+1

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

+0

Ecco un'eccellente spiegazione su cosa sta succedendo: https://groups.google.com/a/cloudfoundry.org/forum/#!topic/vcap-dev/NrlPuBQBkic – Johannes

risposta

0

Non stai uccidendo i tuoi processi figli, quindi sono appesi come zombi. Uccidere i vostri zombi, uccidendo i vostri figli (sì, che suona piuttosto strano) ..

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