যার পিতা-মাতা দীক্ষাপ্রাপ্ত একটি প্রক্রিয়া কীভাবে আমি হত্যা করতে পারি?


27

ট্রান্সমিশন মাঝেমধ্যে আমার এনএএস-এ ঝুলছে। আমি যদি সিগন্যটার পাঠাই তবে এটি প্রক্রিয়া তালিকা থেকে অদৃশ্য হবে না এবং তার পাশেই একটি <defunct>লেবেল উপস্থিত হবে। আমি যদি একটি সিগ্কিল প্রেরণ করি তবে এটি এখনও অদৃশ্য হয় না এবং আমি পিতামাতাকে শেষ করতে পারি না কারণ পিতামাতাই init। আমি প্রক্রিয়াটি থেকে মুক্তি এবং ট্রান্সমিশনটি পুনরায় চালু করার একমাত্র উপায় হ'ল পুনরায় বুট করা।

আমি বুঝতে পারি যে আমি করতে পারি সবচেয়ে ভাল কাজটি ট্রান্সমিশনটি চেষ্টা করে ঠিক করা (এবং আমি চেষ্টা করেছি), তবে আমি সংকলন করার ক্ষেত্রে একজন শিক্ষানবিশ এবং আমি এটি নিশ্চিত করতে চেয়েছিলাম যে আমার টরেন্টগুলি এটির সাথে গোলমাল শুরু করার আগেই শেষ হয়েছিল।


3
কেউ সুস্পষ্টভাবে বলে দিচ্ছে না ... "init" এর মালিকানাধীন একটি <defunct> প্রক্রিয়া অসম্ভব হওয়া উচিত! এটি একটি খুব বিস্ময়কর বসে আছে! তুমি কি নিশ্চিত?
জোয়েলফ্যান

@ জোয়েলফ্যান: আমি নিশ্চিত ছিলাম যে আমি গুরুত্বপূর্ণ কিছু ভুলে যাচ্ছি না তা নিশ্চিত করার জন্য। যে জেমসগুলি বাচ্চাদের হয় তাদের initখুব দ্রুত চলে যাওয়া উচিত যেহেতু initনিয়মিতভাবে এর অনেকগুলি সাধারণ কাজগুলির মধ্যে একটি হিসাবে বাচ্চাদের জন্য অপেক্ষা করা ... <defunct>একটি জম্বিটির মতোই?
ডি.শ্যাওলি

1
মাইন্ডমাইন্ড ... <defunct>ঠিক একটি জম্বি হিসাবে একই। initএটি বাচ্চাদের জন্য অপেক্ষা করবে যাতে এটি তত্ত্বের ক্ষেত্রে কখনই না ঘটে। আমি ভাবছি যদি আপনাকে একটা সেখানে কি ঘটছে SIGCHLDকরতে init?
ডি.শ্যাওলি

@ জোয়েলফ্যান: হ্যাঁ, আমি নিশ্চিত পিপিআইডি এর মান 1 (আরম্ভ) ছিল, সুতরাং প্রক্রিয়াটি সাইন করা অসম্ভব ছিল।
অ্যান্ডি ই

3

উত্তর:


35

আপনি কোনও <defunct>প্রক্রিয়া (জম্বি প্রক্রিয়া নামেও পরিচিত) মারতে পারবেন না কারণ এটি ইতিমধ্যে মারা গেছে। প্রস্থানটি স্থিতি সংগ্রহের জন্য সিস্টেমটি পিতামাতার জন্য জম্বি প্রক্রিয়াগুলি রাখে। যদি পিতামাতারা প্রস্থান স্থিতি সংগ্রহ না করেন তবে জম্বি প্রক্রিয়াগুলি চিরকালের জন্য থাকবে। এই জম্বি প্রক্রিয়া থেকে মুক্তি পাওয়ার একমাত্র উপায় হ'ল পিতামাতাকে হত্যা করা। যদি পিতামাতাকে দীক্ষা দেওয়া হয় তবে আপনি কেবল পুনরায় বুট করতে পারেন।

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

http://en.wikipedia.org/wiki/Zombie_process


9
initকখনও জম্বি বাচ্চা থাকতে পারে না। উইকিপিডিয়া নিবন্ধ থেকে: যখন কোনও প্রক্রিয়া তার পিতামাতাকে হারায়, তখন DI তার নতুন পিতামাতায় পরিণত হয়। উদ্যোগ প্যারেন্ট হিসাবে প্রাথমিকভাবে যে কোনও জম্বি ফসল কাটার জন্য ওয়েট সিস্টেম কলটি সম্পাদন করে। এর অন্যতম initদায়িত্ব হ'ল অনাথ এবং পিতামহীন জম্বিদের কাটা।
ডি.শ্যাওলি

14
@ ডি.শ্যাওলি: initবাগ থাকতে পারে। আর ডি রিপ্লেসমেন্টে runitএকটি বাগ রয়েছে যা এই সমস্যার কারণ হয়ে দাঁড়ায়।
ক্যাম

2
আর ডি এর ছিন্নমূল বাচ্চা থাকতে পারে, সম্ভবত কোনও বাগের কারণে, তবে তা পারে। কারণ আমি এখনই একজনের দিকে তাকাচ্ছি।
স্টুডিজ

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

6

ট্রান্সমিশন সি উত্স কোডটি ঠিক করার চেষ্টা করা যে কোনও ব্যক্তিকে জম্বি এবং সিগন্যাল হ্যান্ডলারগুলি এড়ানোর জন্য "ডাবল কাঁটাচামচ" কৌশল সম্পর্কে পড়া উচিত ... এবং এটি কীভাবে স্মার্ট বৈকল্পিক স্পোন ফাংশনের অংশ হিসাবে ব্যবহার করা যেতে পারে ( ইউনিক্সে স্প্যানিং দেখুন )।

excerpt from: 
   "Spawning in Unix", http://lubutu.com/code/spawning-in-unix

Double fork
This trick lets you spawn processes whilst avoiding zombies, without 
installing any signal handler. The first process forks and waits for its 
child; the second process forks and immediately exits and is reaped;
the third process is adopted by init, and executes the desired program. 
All zombies accounted for, since init is always waiting.

if(fork() == 0) {
   if(fork() == 0) {
       execvp(file, argv);
       exit(EXIT_FAILURE);
   }
   exit(EXIT_SUCCESS);
}
wait(NULL);

1
ডাবল কাঁটাচামচটি জম্বি প্রক্রিয়াগুলিকে বাধা দেয় যাতে কর্নেলকে তার পিতামাতাকে পিআইডি 1 তে সেট করতে বাধ্য করে, যা জম্বিগুলি পরিষ্কার করার কথা বলে মনে হয়। মনে হচ্ছে ট্রান্সমিশনটি ইতিমধ্যে এটি করেছে, কারণ এর পিতামাতাই ইতিমধ্যে 1 প্রক্রিয়া করছে
শে

1
এখানে একাধিক সমস্যা রয়েছে। # 1: কেবল পিতামাতার কল করা উচিত exit(3); _exit(2)পরিবর্তে বাচ্চাদের কল করা উচিত (অন্যথায় আপনি অন্যান্য সমস্যার মধ্যে একাধিক স্টিডিও ফ্লাশ পান)। # 2: এটি ব্যর্থ হলে এটি execvp(3)ব্যবহার করতে পারে perror(3)। # 3: আপনার signal(SIGCHLD, SIG_IGN)পুরো গণ্ডগোলের পরিবর্তে কেবল ব্যবহার করা উচিত ।
কেভিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.