প্রকৃত জম্বির মতো একটি জম্বি প্রক্রিয়াও হত্যা করা যায় না, কারণ এটি ইতিমধ্যে মারা গেছে।
এটা কিভাবে হয়
যখন লিনাক্স / ইউনিক্সে কোনও প্রক্রিয়া মারা যায় / শেষ হয় প্রক্রিয়া থেকে সমস্ত তথ্য সিস্টেমের মেমোরি থেকে সরিয়ে ফেলা হয়, কেবলমাত্র প্রক্রিয়া বর্ণনাকারী থেকে যায়। প্রক্রিয়াটি রাজ্যে জেড (জম্বি) পান। তার প্যারেন্ট প্রসেসটি কার্নেল থেকে একটি সংকেত পেয়েছে: এর SIGCHLD
অর্থ হল যে তার এক সন্তানের প্রক্রিয়াটি প্রস্থান করে, বাধাগ্রস্ত হয় বা বাধা হয়ে যাওয়ার পরে পুনরায় শুরু হয় (আমাদের ক্ষেত্রে এটি কেবল প্রস্থান হয়)।
অভিভাবক প্রক্রিয়াটির এখন wait()
তার সন্তানের প্রক্রিয়া থেকে প্রস্থান স্থিতি এবং অন্যান্য তথ্য পড়তে সিস্কল চালানো দরকার । তারপরে বর্ণনাকারী স্মৃতি থেকে সরানো হয় এবং প্রক্রিয়াটি আর একটি জম্বি হয় না is
যদি wait()
পিতামহীন প্রক্রিয়াটি কখনই সিস্কেলকে কল না করে তবে জম্বি প্রক্রিয়া বর্ণনাকারী স্মৃতিতে থাকে এবং মস্তিষ্ক খায়। সাধারণত আপনি জম্বি প্রক্রিয়াগুলি দেখতে পাচ্ছেন না, কারণ উপরের পদ্ধতিটিতে কম সময় লাগে।
মরার ভোর
প্রতিটি প্রক্রিয়া বর্ণনাকারীর খুব স্বল্প পরিমাণে মেমরির প্রয়োজন হয়, তাই কয়েকটি জম্বি খুব বিপজ্জনক নয় (বাস্তব জীবনের মতো)। একটি সমস্যা হ'ল প্রতিটি জম্বি প্রক্রিয়া তার প্রক্রিয়া আইডি রাখে এবং একটি লিনাক্স / ইউনিক্স অপারেটিং সিস্টেমে সীমিত সংখ্যক পিড থাকে। যদি কোনও অনুপযুক্ত প্রোগ্রামযুক্ত সফ্টওয়্যার প্রচুর পরিমাণে জম্বি প্রক্রিয়া উত্পন্ন করে তবে এমনটি ঘটতে পারে যে প্রক্রিয়াগুলি আর শুরু করা যায় না কারণ কোনও প্রসেস আইডি নেই।
সুতরাং, যদি তারা বিশাল গোষ্ঠীতে থাকে তবে তারা খুব বিপজ্জনক (যেমন অনেক সিনেমায় খুব ভাল প্রদর্শিত হয়)
আমরা কীভাবে জম্বিদের একটি দল থেকে নিজেকে রক্ষা করতে পারি?
মাথায় একটি গুলি কাজ করবে, তবে আমি তার জন্য কমান্ডটি জানি না (প্রক্রিয়া ইতিমধ্যে শেষ হয়ে গেছে বলে সিগ্কিল কাজ করবে না)।
ঠিক আছে, আপনি প্যারেন্ট প্রসেসে কিলের মাধ্যমে SIGCHLD প্রেরণ করতে পারেন, কিন্তু যখন এটি এই সিগন্যালটিকে উপেক্ষা করে তখন কি হবে? আপনার একমাত্র বিকল্প হ'ল পিতামাতার প্রক্রিয়াটি হ'ল আর init প্রক্রিয়াটি জম্বিটিকে "গ্রহণ" করে। ইনিশ wait()
তার জম্বি বাচ্চাদের সাফ করার জন্য পর্যায়ক্রমে সিস্কেলকে কল করে ।
তোমার ক্ষেত্রে
আপনার ক্ষেত্রে, আপনাকে ক্রন্ড প্রক্রিয়াতে SIGCHLD প্রেরণ করতে হবে:
root@host:~# strace -p $(pgrep cron)
Process 1180 attached - interrupt to quit
তারপরে অন্য টার্মিনাল থেকে:
root@host:~$ kill -17 $(pgrep cron)
আউটপুটটি হ'ল:
restart_syscall(<... resuming interrupted call ...>) = ? ERESTART_RESTARTBLOCK (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fff51be39dc, WNOHANG, NULL) = -1 ECHILD (No child processes) <-- Here it happens
rt_sigreturn(0xffffffffffffffff) = -1 EINTR (Interrupted system call)
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1892, ...}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {0x403170, [CHLD], SA_RESTORER|SA_RESTART, 0x7fd6a7e9d4a0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({42, 0}, ^C <unfinished ...>
Process 1180 detached
আপনি wait4()
সিস্কেলটি -১ ইসিএলডিডিটি দেখেন, যার অর্থ কোনও শিশু প্রক্রিয়া নেই। সুতরাং উপসংহারটি হ'ল: ক্রোন SIGCHLD সিস্টেমে প্রতিক্রিয়া জানায় এবং অ্যাপোক্যালিসটিকে জোর করা উচিত নয়।