मैं दो लंबे समय तक node.js प्रक्रियाओं को संवाद करने की कोशिश कर रहा हूं - माता-पिता और बच्चे - पाइप और नोड के child-process मॉड्यूल का उपयोग करके। मैं चाहता हूं कि बच्चा माता-पिता को डेटा को असीमित रूप से वापस भेजने में सक्षम हो, और मैं ऐसा करने के लिए pipe का उपयोग करने की उम्मीद कर रहा था।Node.js बाल प्रक्रियाओं और पाइप - ओएसएक्स बनाम उबंटू
यहाँ मेरी कोड का एक सरलीकृत संस्करण है:
जनक:
cp = require('child_process')
es = require('event-stream')
child = cp.spawn('coffee', ['child.coffee'], {stdio: [null, null, null, 'pipe']})
so = child.stdout.pipe(es.split())
p3 = child.stdio[3].pipe(es.split())
so.on 'data', (data) ->
console.log('stdout: ' + data)
child.stderr.on 'data', (data) ->
console.log('stderr: ' + data);
p3.on 'data', (data) ->
console.log('stdio3: ' + data);
child.on 'close', (code) ->
console.log('child process exited with code ' + code)
child.stdin.write "a message from your parent", "utf8"
बाल:
fs = require('fs')
p3 = fs.createWriteStream('/dev/fd/3', {encoding: 'utf8'})
process.stdin.on 'data', (data) ->
p3.write "hello #{process.pid} - #{data}\n", 'utf8'
process.stdout.write "world #{process.pid} - #{data}\n", 'utf8'
p3.end()
process.exit(0)
process.stdin.on 'end', (data) ->
console.log "end of stdin"
p3.end()
process.exit(0)
process.stdin.setEncoding('utf8')
process.stdin.resume()
कोड पर OSX 10.9 काम करता है, लेकिन एक Ubuntu बॉक्स पर चलाने के लिए विफल रहता है। मैंने इसे उबंटू 12.04 और 14.04 दोनों के तहत चलाने की कोशिश की है। मैं नोड 10.2x चला रहा हूँ।
/dev/fd/
उबंटू के तहत प्रतीकात्मक रूप से /proc/self/fd/
से जुड़ा हुआ है, इसलिए मेरा मानना है कि मेरी बाल प्रक्रिया सही फ़ाइल खोल रही है।
Ubuntu पर माता पिता के चलने से उत्पादन इस प्रकार है:
$ coffee parent.coffee
stderr:
stderr: events.js:72
stderr: throw er; // Unhandled 'error' event
stderr:
stderr:
stderr:
stderr:
stderr: ^
stderr: Error: UNKNOWN, open '/dev/fd/3'
events.js:72
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at errnoException (net.js:901:11)
at Pipe.onread (net.js:556:19)
मैं देखना (और एक OSX बॉक्स पर करते हैं) उम्मीद करेंगे:
$ coffee parent.coffee
stdio3: hello 21101 - a message from your parent
stdout: world 21101 - a message from your parent
stdio3:
stdout:
child process exited with code 0
यह के साथ संवाद करने के लिए संभव है बच्चा उबंटू पर भी कमांड लाइन का उपयोग कर रहा है, इसलिए बच्चे की प्रक्रिया को जन्म देने पर माता-पिता में समस्या होने की संभावना है:
$ echo foo | coffee child.coffee 3>&1
hello 3077 - foo
world 3077 - foo
मैंने कर्नेल कॉल की जांच करने का प्रयास किया है जो नोड strace का उपयोग करता है, लेकिन आउटपुट की अधिक समझ नहीं ले सका।
'ps aux का आउटपुट क्या है। grep node' जब दोनों प्रक्रियाएं चल रही हैं? – ctlacko
@ChrisLacko आदेश 'कॉफी parent.coffee' तुरंत दुर्घटनाग्रस्त हो जाता है। ओएसएक्स पर यह प्रिंट करता है कि इसे क्या माना जाता है और फिर बाहर निकलता है। जब मैं इसे पोस्ट पर चलाता हूं तो मैं उन त्रुटियों को जोड़ सकता हूं जो मैं देखता हूं। – Jacob