শুরুর পরে একটি স্প্যান শিশু প্রক্রিয়া আলাদা করুন


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
আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি কেন আপনি নোড থেকে স্বতন্ত্র কোনও প্রক্রিয়াটির স্টাডিআউট / স্টাডার পড়তে পারবেন বলে আশা করছেন expect হয় আপনি, কারণ প্রক্রিয়া যে কাজগুলো আপনার প্রোগ্রাম যে ক্ষেত্রে নোড (শুধু সমান্তরাল চলমান) অংশ কার্য সম্পাদন করে তা আউটপুট গ্রহণ প্রয়োজন উচিত পিতা বা মাতা হতে; বা আপনি একটি সত্যিকারের স্বাধীন প্রোগ্রাম শুরু করছেন, সেক্ষেত্রে এর মানক আউটপুটটি আপনার নোড প্রোগ্রামের উদ্বেগ নয় এবং আপনার তাদের দুটি উপায়ে প্রোগ্রামের জন্য অর্থকে এমনভাবে ভাগ করা উচিত (যেমন একটি ডাটাবেস, ফাইল মনিটর, একটি API সার্ভার) , যাই হোক).
মাইক 'পোম্যাক্স' কামারম্যানস

সম্ভবত আমি যথেষ্ট পরিষ্কার ছিলাম না, যখন আমি প্রক্রিয়াটি শুরু করি তখন এটিকে সংযুক্ত রাখা দরকার কারণ আমি এর আউটপুটটি পড়তে চাই। তবে আমার নোড প্রক্রিয়াটি বন্ধ করার আগে (পিতামাতাকে) আমি সমস্ত সমাপ্ত বাচ্চাদের প্রক্রিয়াটি ব্যাকগ্রাউন্ডে চালিয়ে যাওয়ার জন্য আলাদা করতে চাই।
অপ্সেস

কেন বিভিন্ন প্রক্রিয়া / প্রোগ্রাম নেই, এবং কোনও ফাইল বা অন্য কোনও মাধ্যম ব্যবহার করে তাদের মধ্যে ডেটা ভাগ করুন।
মা'মুন অটম্যান

এটি একটি পাইপ কি না? সুতরাং আপনি নিজেকে প্রক্রিয়াগুলির মধ্যে যোগাযোগ পরিচালনা করার পরামর্শ দিচ্ছেন?
আপস

তবে কেন আপনি এই প্রক্রিয়াটি আলাদা করবেন? হয় এটি আপনার প্রোগ্রামের সেবায় কিছু করছে, এক্ষেত্রে আপনার প্রোগ্রামটি শেষ না হওয়া পর্যন্ত অপেক্ষা করা উচিত, বা এটি প্রক্রিয়াটি নির্দেশ করে যে এটি শেষ হয়ে গেছে এবং এটি কী করছে তা সমাপ্ত করা দরকার কারণ এটি সিক্কিল 'পেতে চলেছে - মূলত : আসল ব্যবহারের ক্ষেত্রে কী? কারণ এটি 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)

আউটপুট

প্রধান
তথ্য প্রাপ্তি শুরু করুন: শিশু শুরু করুন

তথ্য পেয়েছে: সন্তানের কাছ থেকে হ্যালো তথ্য পেয়েছে: সন্তানের কাছ থেকে হ্যালো তথ্য পেয়েছে: সন্তানের কাছ থেকে হ্যালো তথ্য পেয়েছে: সন্তানের
কাছ
থেকে
হ্যালো শিশুটিকে
সংযোগ বিচ্ছিন্ন করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.