2011-10-27 27 views
9

Estoy un poco confundido en cuanto a cómo crear demonios en NodeJSbifurcan en NodeJS

he creado demonios en C antes de esa llamada fork() que continúe la ejecución desde donde se hizo la llamada en un proceso hijo que permite el padre para terminar. No puedo lograr fácilmente el mismo efecto usando process.fork() y process.kill().

El siguiente código no hace lo que yo esperaba y se rompe:

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

El siguiente error se emite y no puedo entender por qué o qué está sucediendo:

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) 

El problema la llamada parece ser process.kill(). Al eliminar esto, ambos procesos continúan funcionando felizmente.

Conozco daemon.node, pero esto fue creado en el momento en que child_process.fork() no existía (v0.1.33 era la versión disponible cuando se escribió daemon.node). Ahora hay una forma nativa de bifurcar, por lo que ya no será necesario. (Además, parece haber sido abandonado también.)

Respuesta

9

child_process.fork() tiene un nombre totalmente engañoso y no es lo mismo que C de fork().

According to the docs, ejecuta una secuencia de comandos Node.js como un proceso secundario y configura un canal de comunicaciones entre el proceso de llamada y el elemento secundario. Eso es.

El desove real del proceso secundario is done inside libuv, la "capa de plataforma" de Node, en C, y fork() en sí mismo no está expuesto a los scripts de nodo.

Una forma sencilla, mucho-mejorable a daemonize utilizando sólo lo que está integrado en Node.js podría tener este aspecto:

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

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

Obviamente, esto es bastante diferente de fork(). Si daemon.node funciona para usted, continúe usándolo.