بعد از جلسه گروه کاربران لینوکس تبریز، روز یکشنبه که آخر جلسه دوستمون یاشار عزیز سوالی مطرح کرد که پروسههای زامبی چه جوری kill میشن و … یه چند روزی بود که تو تعریف و مفهوم این پروسه زامبی مونده بودم و به اشتباه، این پروسه رو با پروسه orphan (یتیم) اشتباه میگرفتم, رفتم سراغشون و البته جادی عزیز, واقعن عالی راهنماییم کرد. من همیشه ممنونشم. حالا بریم ببینیم چی هستن این پروسههای زامبی و چه جوری پیداشون کنیم و …
پروسه زامبی در لینوکس، (zombie process)
در سیستم عاملهای یونیکس و شبیه این, پروسه(procces) زامبی (zombie) به پروسهای گفته میشه که اجراش تموم شده ولی هنوز در جدول پروسه، ورودی داره (تو procces table هستش). به این معنی که پروسه مادر(parent) این پروسه باید وضعیت خروجی فرزند(child) رو ببینه. و این اسم زامبی (انسان هایی که هنوز کامل نمردن) به این دلیل به این پروسهها تلقی میشه، چون تموم شدن ولی نتیجه تموم شدنشون هنوز به مادر نرسیده.
وقتی پروسهای تموم میشه، تمام حافظه و منابعی که بهش تعلق داشته ازش گرفته میشه تا در اختیار پروسه دیگهای گذاشته بشه. هر چند که process’s entry در جدول پروسهها باقی میمونه. مادر میتونه وضعیت خروجی فرزند رو با اجرا کردن فراخوان wait() بخونه و در نتیجه پروسه زامبی حذف میشه. فراخوان wait() ممکنه به صورت دورهای اجرا بشه ولی معمولن وقتی اجرا میشه که سیگنالی از طرف فرزند به مادر برسه (SIGchild) مبنی بر اینکه پروسه فرزند به هردلیلی دیگه اجرا نمیشه.
وقتی که پروسه زامبی حذف شد PID و entry تو جدول پروسه آزاد میشن و میتونن دوباره مورد استفاده قرار بگیرن. اگه مادر نتونه فراخوان wait رو اجرا کنه پروسه زامبی تو جدول پروسهها میمونه و این تو بعضی موارد میتونه خوب باشه، مثل وقتی که مادر یه پروسه فرزند دیگهای اجرا کنه و مطمئن هست که PID پروسه فرزند جدید، با قبلی یکی نیست.(PID جدید میگیره).
پروسه زامبی همان پروسه یتیم(orphan process) نیست . پروسه یتیم – بی پدر و مادر یا بی والد – پروسهای هست که در حال حاضر داره اجرا میشه ولی والدش دیگه نیست, اینها پروسه زامبی نمیشن در عوض توسط (init (process ID 1 به فرزندی گرفته میشوند .
خوب وقتی تو ترمینال دستور top رو بزنیم میتونیم تو قسمت جلوی task ببینیم که چند تا پروسه زامبی داریم. یا با دستور ps aux | awk ‘{ print $8 ” ” $2 }’ | grep -w Z هم میتونیم کل پروسههای زامبی رو ببینیم.
برای حذف این پروسهها از این دستور kill -9 PID استفاده میکنیم تا kill بشه و SIGchild به مادر برسه و اگه مادر نتونست این سیگنال رو دریافت کنه مجبور میشیم مادر رو kill کنیم تا این پروسه زامبی به فرزندی init در بیاد و init فراخوان wait رو پی در پی اجرا میکنه تا وضعیت پایان یافتن زامبیها رو بگیره.
برای مثال این یه برنامه تولید کننده زامبی هست . رو سیستماتون gcc رو نصب کنید و این فایل روکامپایل و بعد اجرا کنید.
امیدوارم همونقدر که برای من مفید بود برای شما هم مفید باشه .
مشتاق علم باشیم و همیشه خندون 🙂