فرایند زامبی
در سیستمعامل های یونیکس و مانند آن، پروسه زامبی یا فرایند زامبی (به انگلیسی: Zombie process) به پروسهای گفته میشود که اجرای آن تمام شده است، ولی هنوز در جدول پروسه (process 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 $۸ ” ” $۲ }’ | grep -w Z هم میتوانیم کل پروسههای زامبی را ببینیم.
برای حذف این پروسهها از دستور kill -9 PID استفاده میکنیم، تا kill شوند و SIGchild به مادر برسد، و اگر مادر نتوانست این سیگنال را دریافت کند، مجبور میشویم مادر را kill کنیم تا این پروسه زامبی به فرزندی init در بیاد و init فراخوان wait رو پی در پی اجرا میکند تا وضعیت پایان یافتن زامبیها را دریافت کند.