NodeJS

2011-10-27 24 views
9

में forking मैं थोड़ा उलझन में हूँ के रूप में कैसे NodeJS में डेमॉन बनाने के लिएNodeJS

मुझे लगता है कि कॉल fork() कि जहां कॉल एक बच्चे की प्रक्रिया की इजाजत दी में बनाया गया था से निष्पादन आगे बढ़ने से पहले सी में डेमॉन बना लिया है माता-पिता को समाप्त करने के लिए। मैं process.fork() और process.kill() का उपयोग करके एक ही प्रभाव को आसानी से प्राप्त नहीं कर सकता।

निम्नलिखित कोड मैं क्या उम्मीद और क्या नहीं करता है टूट जाता है:

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

निम्न त्रुटि उत्सर्जित होता है और मैं बाहर काम नहीं कर सकता क्यों या क्या हो रहा है:

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) 

समस्या कॉल process.kill() प्रतीत होता है। इसे हटाने, दोनों प्रक्रियाओं को खुशी से चलना जारी है।

मुझे daemon.node से अवगत है, लेकिन यह उस समय बनाया गया था जब child_process.fork() मौजूद नहीं था (v0.1.33 संस्करण था जब daemon.node लिखा गया था)। अब कांटा का मूल तरीका है, इसलिए यह अब आवश्यक नहीं होना चाहिए। (साथ ही, यह भी छोड़ दिया गया है प्रतीत होता है।)

उत्तर

9

child_process.fork() एक पूरी तरह से भ्रामक नाम है और सी fork() के रूप में ही नहीं है।

According to the docs, यह एक नोड.जेएस स्क्रिप्ट को बाल प्रक्रिया के रूप में निष्पादित करता है और कॉलिंग प्रक्रिया और बच्चे के बीच संचार चैनल सेट करता है। बस।

बच्चे प्रक्रिया is done inside libuv सी में, नोड के "मंच परत," की वास्तविक स्पॉन, और fork() ही नोड लिपियों के संपर्क में नहीं है।

एक सरल, बहुत improvable तरह से उपयोग करते हुए केवल क्या निर्मित है Node.js को इस प्रकार दिखाई देंगे daemonize रहे हैं:

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

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

जाहिर है, इस fork() से बहुत अलग है। यदि daemon.node आपके लिए काम करता है, तो इसका उपयोग करते रहें।