چگونه فرایندهای زامبی را در لینوکس از بین ببریم


Fatmavati احمد زائنوری / Shutterstock

برنامه هایی که ضعیف نوشته شده اند یا عملکرد ضعیفی دارند ، می توانند فرایندهای زامبی را در کمین کامپیوتر لینوکس شما بگذارند. دریابید که چگونه زامبی ها ایجاد می شوند و چگونه می توانید در نهایت به آنها استراحت دهید.

نحوه کار فرایندهای لینوکس

البته لینوکس باید تمام برنامه ها و دیمون هایی را که در رایانه شما اجرا می شوند ، کنترل کند. یکی از راه های انجام این کار حفظ جدول فرآیند است. این لیستی از ساختارهای موجود در حافظه هسته است. هر فرآیند یک ورودی در این لیست دارد که حاوی برخی از اطلاعات در مورد آن است.

در هر یک از ساختارهای جدول فرایندهای زیادی وجود ندارد. آنها شامل شناسه فرآیند ، چندین عنصر داده دیگر و یک اشاره گر به واحد کنترل فرآیند (PCB) برای آن فرآیند هستند.

این یک صفحه مدار چاپی است که شامل بسیاری از جزئیات است که لینوکس باید هر فرآیند را جستجو یا تنظیم کند. PCB همچنین با ایجاد فرآیندی ، زمان پردازش و در نهایت از بین رفتن ، به روز می شود.

PCB لینوکس شامل بیش از 95 قسمت است. به عنوان ساختاری به نام تعریف می شود task_struct.hو بیش از 700 خط طول دارد. PCB حاوی انواع زیر اطلاعات است:

  • وضعیت فرآیند: شرایط در زیر شرح داده شده است.
  • شماره فرآیند: شناسه منحصر به فرد آن در سیستم عامل.
  • شمارنده برنامه: هنگامی که این فرآیند دسترسی پردازنده بعدی را دریافت می کند ، سیستم با استفاده از این آدرس دستورالعمل بعدی فرآیند را اجرا می کند.
  • ثبت نام: لیست رجیسترهای CPU مورد استفاده در این فرآیند. این لیست می تواند حاوی باتری ، رجیسترهای فهرست ، و نشانگرهای پشته باشد.
  • لیست پرونده را باز کنید: پرونده های مربوط به این فرایند.
  • اطلاعات زمان بندی CPU: برای تعیین اینکه هر چند وقت یکبار و برای چه مدت زمان پردازش CPU به این فرآیند داده می شود ، استفاده می شود. اولویت فرآیند ، زمانبندی نشانگرهای صف و سایر پارامترهای برنامه ریزی باید در PCB نوشته شود.
  • اطلاعات مدیریت حافظه: جزئیات حافظه ای که این فرآیند از آن استفاده می کند ، مانند آدرس های شروع و پایان حافظه پردازش و اشاره گرها به صفحات حافظه.
  • اطلاعات وضعیت ورودی / خروجی: کلیه دستگاههای ورودی یا خروجی مورد استفاده فرایند.

“وضعیت فرآیند” می تواند هر یک از موارد زیر باشد:

  • R: فرایند کار یا اجرایی اجرا می شود ، به این معنی که سیکل های پردازنده را دریافت می کند و اجرا می شود. یک فرایند اجرایی آماده شروع است و منتظر شکاف پردازنده است.
  • با: روند خواب این فرآیند در انتظار تکمیل عملیاتی مانند عملیات ورودی یا خروجی یا منابعی است که در دسترس خواهد بود.
  • D: این روند در حالت خواب مداوم است. از مکالمه سیستمی مسدودکننده استفاده می کند و نمی تواند تا زمان تکمیل تماس های سیستمی ادامه یابد. بر خلاف حالت Sleep ، یک فرآیند در این حالت تا زمانی که تماس سیستم به اتمام نرسد و اجرا به روند بازگردد به سیگنال ها پاسخ نخواهد داد.
  • T: این فرآیند به دلیل دریافت دریافت خاتمه یافت SIGSTOP علامت. او فقط پاسخ خواهد داد SIGKILL یا SIGCONT سیگنالهایی که به ترتیب فرآیند را می کشند یا به آن دستور می دهند که ادامه یابد. این اتفاق می افتد هنگامی که شما از پیش زمینه تغییر حالت دهید (fg) به پس زمینه (bg) وظایف
  • با: روند زامبی. وقتی روند کار تمام شد ، فقط از بین نمی رود. هر حافظه استفاده شده را آزاد کرده و از حافظه پاک می کند ، اما ورود آن در جدول پردازش و PCB باقی می ماند. وضعیت آن تنظیم شده است EXIT_ZOMBIE، و روند والدین وی مطلع شده است (توسط SIGCHLD سیگنال) که روند کودک به پایان رسیده است.

در حالت Zombie ، فرآیند والدین یکی از موارد زیر را فراخوانی می کند wait() خانواده های عملکرد هنگام ایجاد روند کودکان. سپس منتظر تغییر وضعیت روند کودک باشید. آیا این روند متوقف شده است ، ادامه دارد یا کودک توسط یک سیگنال کشته می شود؟ آیا او با تکمیل کامل کد خود متوقف شد؟

اگر تغییر وضعیت به گونه ای باشد که روند کودک متوقف شود ، کد منبع آن خوانده می شود. سپس PCB کودک از بین رفته و ورودی آن در جدول فرآیند حذف می شود. در حالت ایده آل ، همه اینها در یک چشم به هم زدن اتفاق می افتد ، و فرایندهای حالت زامبی برای مدت طولانی وجود ندارد.

متصل: نحوه شروع و کنترل فرایندهای پس زمینه لینوکس

چه عواملی باعث فرآیندهای زامبی در لینوکس می شود؟

روند والدین نوشته شده ضعیف ممکن است برقرار نباشد wait() عملکرد هنگام ایجاد فرآیند کودک. این بدان معناست که هیچ چیز برای تغییر در وضعیت فرایند دختر و SIGCHLD سیگنال نادیده گرفته خواهد شد یا شاید برنامه دیگری ، یا به دلیل برنامه نویسی ضعیف یا قصد سوicious ، بر اجرای روند فرزندپروری تأثیر بگذارد.

با این حال ، اگر روند فرزندپروری تغییرات وضعیت فرایند کودک را کنترل نکند ، نگهداری صحیح سیستم اتفاق نمی افتد. PCB و ورودی جدول فرآیند با تکمیل مراحل کودک حذف نمی شوند. این باعث می شود که هرگز زامبی از PCB خارج نشود.

زامبی ها از حافظه کمی استفاده می کنند اما معمولاً مشکلی ایجاد نمی کنند. ورودی جدول پردازش کوچک است ، اما تا زمانی که آزاد نشود ، نمی توان از شناسه فرآیند استفاده مجدد کرد. در یک سیستم عامل 64 بیتی ، بعید است این مسئله مشکلی ایجاد کند زیرا PCB بسیار بزرگتر از ورودی جدول فرآیند است.

تعداد زیادی از زامبی ها می توانند بر میزان حافظه ای که برای سایر فرایندها آزاد است تأثیر بگذارند. اگر این همه زامبی داشته باشید ، با مشکل جدی در برنامه والدین یا خطا در سیستم عامل روبرو هستید.

نحوه حذف فرایندهای زامبی

شما نمی توانید یک فرآیند زامبی را بکشید زیرا این کار از قبل مرده است. این به هیچ سیگنالی پاسخ نخواهد داد زیرا از حافظه پاک می شود – جایی برای ارسال وجود ندارد SIGKILL علامت. می توانید ارسال کنید SIGCHLD سیگنال فرآیند والدین ، ​​اما اگر هنگام خاتمه روند کودک نتیجه ندهد ، بعید است که اکنون کار کند.

تنها راه حل قابل اعتماد از بین بردن روند فرزندپروری است. هنگامی که خاتمه می یابد ، فرآیندهای دختر از آن به ارث می رسد init روند ، که اولین فرآیند آغاز شده در سیستم لینوکس است (شناسه فرآیند آن 1 است).

init روند به طور منظم تمیز کردن لازم از زامبی ها را انجام می دهد ، بنابراین برای کشتن آنها ، فقط باید فرآیند ایجاد آنها را بکشید. top دستور راهی مفید برای دیدن زامبی ها است یا خیر.

زیر را وارد کنید:

top

بالا در یک پنجره ترمینال

این سیستم دارای هشت فرآیند زامبی است. ما می توانیم آنها را با استفاده از لیست کنیم ps دستور و ورود به آن egrep. باز هم ، فرایندهای زامبی دارای یک پرچم “Z” هستند و شما همچنین “غیر موجود” را نیز مشاهده خواهید کرد.

زیر را وارد کنید:

ps aux | egrep "Z|defunct"

ps به |  egrep "Z |  موجود نیست" در یک پنجره ترمینال

فرآیندهای زامبی ذکر شده است.

از ps aux خارج شوید  egrep "Z |  موجود نیست" در یک پنجره ترمینال

این یک روش بهتر برای یافتن شناسه های زامبی از پیمایش به جلو و عقب است top. همچنین می بینیم که برنامه ای به نام “badprg” باعث تولید این زامبی ها شده است.

شناسه فرآیند اولین زامبی 7641 است ، اما ما باید شناسه فرآیند پردازش اصلی آن را پیدا کنیم. ما می توانیم آن را با کمک انجام دهیم ps از نو. ما از گزینه خروجی استفاده خواهیم کرد (-o) گفتن ps فقط شناسه فرآیند والدین را نشان دهید و سپس آن را با آن منتقل کنید ppid= پرچم.

فرایندی که می خواهیم پیدا کنیم با استفاده از مشخص می شود -p گزینه (پردازش) و سپس شناسه فرآیند را به زامبی منتقل کنید.

بنابراین ، برای جستجوی اطلاعات فرآیند پردازش 7641 ، دستور زیر را وارد می کنیم ، اما این فقط شناسه پردازش والدین را گزارش می کند:

ps -o ppid= -p 7641

ps -o ppid = -p 7641 در یک پنجره ترمینال

به ما گفته شده است که شناسه پردازش والدین 7636 است. اکنون می توانیم این شماره را منتقل کنیم ps یک بار دیگر

ps -e |  grep 7636 در یک پنجره ترمینال

می بینیم که این مصادف با نام مراحل فرزندپروری از اوایل است. برای از بین بردن روند اصلی ، از گزینه SIGKILL با دستور kill به شرح زیر استفاده کنید:

kill -SIGKILL 7636

بسته به صاحب فرآیند والدین ، ​​ممکن است لازم باشد از آن استفاده کنید sudo.

زامبی ها ترسناک نیستند …

… مگر اینکه آنها در انبوهی عظیم باشند. چند مورد جای نگرانی نیست و یک راه اندازی مجدد ساده آنها را از بین می برد.

با این حال ، اگر متوجه شدید که یک برنامه یا پردازش همیشه زامبی ها را به دنیا می آورد ، این چیزی است که باید آن را در نظر بگیرید. به احتمال زیاد ، این فقط یک برنامه نوشته شده با بی احتیاطی است ، که در این صورت ممکن است یک نسخه به روز شده وجود داشته باشد که پس از مراحل کودک شما به درستی تمیز شود.




منبع: khabar-mehman.ir

دیدگاهتان را بنویسید

Comment
Name*
Mail*
Website*