2011-10-27 22 views
9

Sono un po 'confuso su come creare demoni in NodeJSForking in NodeJS

Ho creato demoni in C prima di quella chiamata fork() che continuare l'esecuzione dal punto in cui la chiamata è stata fatta in un processo figlio permettendo il genitore di terminare. Non riesco a ottenere facilmente lo stesso effetto utilizzando process.fork() e process.kill().

Il seguente codice non fa quello che mi aspettavo e pause:

var current_pid, cp = require('child_process'); 
current_pid = process.pid; 
cp.fork(''); 
process.kill(current_pid); 

Il seguente errore viene emesso e non riesco a capire perché o che cosa sta succedendo:

node.js:202 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: read EBADF 
    at errnoException (net.js:589:11) 
    at Pipe.onread (net.js:335:20) 

Il problema la chiamata sembra essere process.kill(). Rimuovendo questo, entrambi i processi continuano a funzionare felicemente.

Sono a conoscenza di daemon.node, ma questo è stato creato nel momento in cui child_process.fork() non esisteva (v0.1.33 era la versione disponibile quando è stato scritto daemon.node). Ora c'è un modo nativo di fork, quindi questo non dovrebbe più essere necessario. (Inoltre, sembra essere stata abbandonata troppo.)

risposta

9

child_process.fork() ha un nome totalmente fuorviante e non è lo stesso di C di fork().

According to the docs, esegue uno script Node.js come processo figlio e imposta un canale di comunicazione tra il processo chiamante e il figlio. Questo è tutto.

L'effettiva generazione del processo figlio is done inside libuv, il "livello piattaforma" del nodo in C e fork() non è esposto agli script del nodo.

Un modo tanto semplice da migliorabile eseguito come demone utilizzando solo ciò che è built-in per Node.js potrebbe assomigliare a questo:

if (process.argv[2] !== 'child') { 
    require('child_process').execFile(process.argv[0], [__filename, 'child']); 
    process.exit(); 
} 

setTimeout(function(){ 
    console.log('foo'); 
}, 5000); 

Ovviamente, questo è abbastanza diverso da fork(). Se daemon.node funziona per te, continua a usarlo.