शुरुआत के बाद एक स्पॉन चाइल्ड प्रक्रिया को अलग करें


9

मैं इस तरह से एक स्पॉन चाइल्ड प्रक्रिया शुरू करता हूं:

let process = spawn(apiPath, {
  detached: true
})

process.unref()

process.stdout.on('data', data => { /* do something */ })

जब मैं इस प्रक्रिया को शुरू करता हूं तो मुझे इसे संलग्न रखने की आवश्यकता होती है क्योंकि मैं इसका आउटपुट पढ़ना चाहता हूं। लेकिन अपनी नोड प्रक्रिया (अभिभावक) को बंद करने से ठीक पहले मैं सभी समाप्त बच्चों की प्रक्रियाओं को अलग रखना चाहता हूं ताकि उन्हें पृष्ठभूमि में रखा जा सके, लेकिन जैसा कि दस्तावेज कहते हैं:

लंबे समय से चल रही प्रक्रिया को शुरू करने के लिए अलग किए गए विकल्प का उपयोग करते समय, प्रक्रिया माता-पिता के बाहर निकलने के बाद पृष्ठभूमि में नहीं चलती है जब तक कि यह एक स्टैडियो कॉन्फ़िगरेशन के साथ प्रदान नहीं किया जाता है जो माता-पिता से जुड़ा नहीं है।

लेकिन विकल्प के साथ stdio: 'ignore'मैं नहीं पढ़ सकता stdoutजो एक समस्या है।

मैंने मूल प्रक्रिया को बंद करने से पहले पाइप को मैन्युअल रूप से बंद करने की कोशिश की लेकिन यह असफल है:

// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()

1
मैं थोड़ा उलझन में हूँ कि आप नोड की स्वतंत्र प्रक्रिया के stdout / stderr को पढ़ने में सक्षम होने की अपेक्षा क्यों करेंगे। या तो आपको आउटपुट पर कब्जा करने की आवश्यकता है, क्योंकि प्रक्रिया ऐसे कार्य कर रही है जो आपके कार्यक्रम का हिस्सा हैं (सिर्फ समानांतर में चल रहे हैं) जिस स्थिति में नोड का जनक होना चाहिए ; या आप वास्तव में एक स्वतंत्र कार्यक्रम शुरू कर रहे हैं, जिस स्थिति में इसका मानक उत्पादन आपके नोड प्रोग्राम की चिंता नहीं है और आपको उन्हें इस तरह से डेटा साझा करना चाहिए जो दो स्वतंत्र कार्यक्रमों (जैसे एक डेटाबेस, फ़ाइल मॉनिटर, एक एपीआई सर्वर) के लिए समझ में आता है , जो कुछ)।
माइक 'पोमैक्स' कमरमन्स

शायद मैं पर्याप्त स्पष्ट नहीं था, जब मैं इस प्रक्रिया को शुरू करता हूं तो मुझे इसे संलग्न रखने की आवश्यकता होती है क्योंकि मैं इसका आउटपुट पढ़ना चाहता हूं। लेकिन अपनी नोड प्रक्रिया (माता-पिता) को बंद करने से ठीक पहले मैं सभी समाप्त बच्चों की प्रक्रियाओं को अलग करना चाहता हूं ताकि उन्हें पृष्ठभूमि में रखा जा सके।
ओप्स

अलग-अलग प्रक्रियाएं / कार्यक्रम क्यों नहीं हैं, और एक फ़ाइल या किसी अन्य माध्यम का उपयोग करके उनके बीच डेटा साझा करें।
रूट

यह एक पाइप क्या नहीं है? तो आप अपने आप को प्रक्रियाओं के बीच संचार को संभालने का सुझाव देते हैं?
ओपसी

लेकिन आप प्रक्रिया को अलग क्यों करेंगे? या तो यह आपके कार्यक्रम की सेवा में कुछ कर रहा है, जिस स्थिति में आपका कार्यक्रम पूरा होने तक इंतजार करना चाहिए, या इसे उस प्रक्रिया का संकेत देना चाहिए जो समय से बाहर है और इसे पूरा करने की आवश्यकता है क्योंकि यह SIGKILL'd - मूल रूप से होने वाला है : वास्तविक उपयोग मामला क्या है? क्योंकि यह एक XY समस्या के लिए एक प्रमुख उम्मीदवार की तरह लगता है जहां आप कुछ करने की कोशिश कर रहे हैं, और आपने ऐसा करने का तरीका सोचा है, और आप मूल समस्या के बारे में पूछने के बजाय चीजों को करने के तरीके के बारे में पूछ रहे हैं
माइक 'पोमैक्स' कमेरमन्स

जवाबों:


1

कई परीक्षणों के बाद मुझे इस समस्या को हल करने का कम से कम एक तरीका मिला: मुख्य प्रक्रिया को छोड़ने से पहले सभी पाइप को नष्ट करना।

एक मुश्किल बिंदु यह है कि बच्चे की प्रक्रिया को सही ढंग से नष्ट करने वाले पाइप को संभालना है, अगर नहीं तो यह एक त्रुटि हो सकती है और वैसे भी बंद हो सकती है। इस उदाहरण में नोड चाइल्ड प्रक्रिया को इससे कोई समस्या नहीं है, लेकिन यह अन्य परिदृश्य के साथ भिन्न हो सकती है।

main.js

const { spawn } = require('child_process')

console.log('Start Main')

let child = spawn('node', ['child.js'], { detached: true })
child.unref() // With this the main process end after fully disconnect the child

child.stdout.on('data', data => {
  console.log(`Got data : ${data}`)
})

// In real case should be triggered just before the end of the main process
setTimeout(() => {
  console.log('Disconnect the child')

  child.stderr.unpipe()
  child.stderr.destroy()
  child.stdout.unpipe()
  child.stdout.destroy()
  child.stdin.end()
  child.stdin.destroy()
}, 5000)

child.js

console.log('Start Child')

setInterval(function() {
   process.stdout.write('hello from child')
}, 1000)

उत्पादन

स्टार्ट मेन
गॉट डेटा: स्टार्ट चाइल्ड

डेटा मिला: बच्चे से हैलो डेटा मिला: बच्चे से हैलो डेटा से
मिला: बच्चे से हैलो
डेटा से
मिला: बच्चे से हैलो बच्चे से संपर्क
करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.