نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • ویندوز 8
  • از بین بردن فرآیندهای غیر ضروری در لینوکس. کشتن فرآیندها در لینوکس - دستورات ps، kill و killall

از بین بردن فرآیندهای غیر ضروری در لینوکس. کشتن فرآیندها در لینوکس - دستورات ps، kill و killall

سیستم عامل یونیکس Robachevsky Andrey M.

شناسه فرآیند (PID)

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

این متن یک قسمت مقدماتی است.برگرفته از کتاب معماری سیستم عامل یونیکس نویسنده باخ موریس جی

4.4 تبدیل نام مؤلفه فایل (مسیر جستجو) به شناسه ایندکس مرجع اولیه یک فایل با نام واجد شرایط آن (مسیر جستجو) است، مانند دستورات open، chdir (تغییر دایرکتوری)، یا پیوند. زیرا در داخل سیستم هسته با ایندکس ها کار می کند نه با

برگرفته از کتاب یک حرفه نادر نویسنده Zuev Evgeniy

شناسه چیست؟ علاوه بر ابهامات در نحو، مشکلات دیگری نیز به سرعت پدیدار شد. نشان دادن آنها با مثال دشوارتر است، بنابراین باید آنها را با کلمات توضیح دهید. نحو زبان C++ از جنبه دیگری نیز ناخوشایند است. به طور خلاصه، مستقیم

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

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

از کتاب 200 بهترین برنامه برای اینترنت. آموزش محبوب نویسنده Krainsky I

Process Guardian XP سازنده: T.A.S. برنامه نویسی مستقل (http://www.tas-independent-programming.com).وضعیت: رایگان.لینک دانلود: http://www.tas-independent-programming.com/cgi-bin/countdown.pl?Guardian. exe .اندازه: 2.4 مگابایت.هدف اصلی این ابزار مدیریت فرآیندهای در حال اجرا بر روی کامپیوتر است.

برگرفته از کتاب Microsoft Visual C++ and MFC. برنامه نویسی برای ویندوز 95 و ویندوز NT نویسنده فرولوف الکساندر ویاچسلاوویچ

شناسه فایل باز کلاس CFile شامل یک عنصر داده m_hFile از نوع UINT است. شناسه فایل باز را ذخیره می کند. اگر یک شی از کلاس CFile ایجاد کرده اید، اما هنوز هیچ فایلی را باز نکرده اید، ثابت hFileNull در m_hFile نوشته می شود، معمولاً نیازی نیست.

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

شناسه تراکنش یکی دیگر از بخش‌های استراتژی بازنمود و ارسال مجدد، استفاده از شناسه‌های تراکنش (XID) برای تمایز بین درخواست‌های مشتری و پاسخ‌های سرور است. هنگامی که یک سرویس گیرنده یک تابع RPC را فراخوانی می کند، کتابخانه آن را اختصاص می دهد

برگرفته از کتاب TCP/IP Architecture, Protocols, Implementation (شامل IP نسخه 6 و IP Security) توسط Faith Sydney M

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

از کتاب آموزش Adobe Audition 3 نویسنده نویسنده ناشناس

Dynamic EQ (فرآیند) اثر Dynamic EQ میزان فیلتر را در طول زمان تغییر می دهد. به عنوان مثال، در نیمه اول موج می توانید فرکانس های بالا را تقویت کنید و در نیمه دوم می توانید عرض باند فرکانسی تحت تأثیر را تغییر دهید. پنجره Dynamic EQ دارای سه زبانه است: Gain، Frequency و Q (پهنای باند). 1. نمودار فرکانس

از کتاب مرجع PHP نویسنده

Pan/Expander (فرآیند) افکت Pan/Expand به شما این امکان را می دهد که کانال مرکزی (مولفه مونو) یک سیگنال استریو را جابجا کنید و جداسازی استریو کانال های چپ و راست را گسترده یا محدود کنید. کانال مرکزی با استفاده از مرکز و کانال های اطراف ضبط استریو،

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

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

از کتاب Firebird DATABASE DEVELOPER'S GUIDE توسط بوری هلن

شناسه جلسه بنابراین، شناسه جلسه نام فضای ذخیره سازی موقتی است که برای ذخیره داده های جلسه بین اجراهای اسکریپت استفاده می شود. یک SID - یک ذخیره سازی. بدون SID، بدون فضای ذخیره‌سازی و بالعکس، پس شناسه و نام چگونه به هم مرتبط هستند؟

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

10.2.1. Process ID و Origin دو مورد از اساسی ترین ویژگی ها عبارتند از شناسه فرآیند یا pid و شناسه فرآیند والد آن. pid یک عدد صحیح مثبت است که به طور یکتا مشخص می شود

از کتاب نویسنده

10.2.3. Uid سیستم فایل در موارد بسیار خاص، ممکن است یک برنامه نیاز داشته باشد که امتیازات ریشه خود را برای همه چیز به جز دسترسی به سیستم فایل، که برای آن از uid کاربر استفاده می کند، حفظ کند. ابتدا در سرور فضایی لینوکس NFS استفاده می شد

از کتاب نویسنده

شناسه دامنه هنگامی که یک دامنه در پایگاه داده ایجاد می کنید، باید شناسه دامنه ای را مشخص کنید که در پایگاه داده در سطح جهانی منحصر به فرد باشد. توسعه دهندگان اغلب از یک پیشوند یا پسوند در شناسه های دامنه برای بهبود اسناد استفاده می کنند. به عنوان مثال: ایجاد

از کتاب نویسنده

از کتاب نویسنده

شناسه فرآیند والد (PPID) شناسه فرآیندی که این را ایجاد کرده است

آیا فکر می کنید سیستم عامل لینوکس می تواند به طور خودکار از خودش مراقبت کند؟ وقتی همه چیز خوب کار می کند یا به هیچ ویژگی غیر استانداردی نیاز ندارید، بله. اما گاهی اوقات ممکن است دخالت شما در کار او ضروری باشد.

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

این مقاله موضوع گسترده ای را پوشش می دهد و احتمالات زیر را بررسی می کنیم:

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

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

بیایید با درک شرایط شروع کنیم. اساساً هر برنامه ای یک فرآیند است. همانطور که قبلاً گفتم، برای هر برنامه راه اندازی شده یک فرآیند جداگانه ایجاد می شود. به عنوان بخشی از یک فرآیند، به یک برنامه زمان CPU، RAM و سایر منابع سیستم اختصاص می یابد. هر فرآیند دارای شناسه خود، شناسه فرآیند یا به سادگی PID است و فرآیندهای لینوکس اغلب توسط آنها شناسایی می شوند. PID به طور تصادفی تعیین نمی شود؛ همانطور که قبلاً گفتم، برنامه مقداردهی اولیه PID 1 را دریافت می کند و هر برنامه راه اندازی شده بعدی یک برنامه دیگر دریافت می کند. بنابراین، PID برنامه های کاربر به چندین هزار می رسد.

در واقع، فرآیندهای لینوکس آنقدرها که اکنون به نظر می رسد انتزاعی نیستند. می توانید سعی کنید آنها را احساس کنید. مدیر فایل خود را باز کنید، به دایرکتوری ریشه بروید، سپس پوشه /proc را باز کنید. یک سری اعداد را اینجا می بینید؟ بنابراین این همه است - PID تمام فرآیندهای در حال اجرا. هر یک از این پوشه ها حاوی تمام اطلاعات مربوط به فرآیند است.

به عنوان مثال، اجازه دهید به پوشه فرآیند 1 نگاه کنیم. فایل cmdline حاوی اطلاعاتی در مورد دستور راه اندازی فرآیند است:

cat /proc/1/cmdline

/usr/lib/systemd/systemd

از آنجایی که من از سیستم مقداردهی اولیه Systemd استفاده می کنم، اولین فرآیند برای آن راه اندازی می شود. شما می توانید همه کارها را با پوشه /proc انجام دهید. اما این بسیار ناخوشایند است، به خصوص با توجه به تعداد فرآیندهای در حال اجرا در سیستم. بنابراین، ابزارهای ویژه ای برای اجرای وظایف لازم وجود دارد. بیایید به بررسی ابزارهایی بپردازیم که به شما امکان می دهند مدیریت فرآیند را در لینوکس پیاده سازی کنید.

مدیریت فرآیند در لینوکس

لینوکس دارای تعداد بسیار زیادی ابزار برای حل وظایف مختلف مدیریت فرآیند است. اینها شامل راه حل های چند منظوره مانند htop، top، و همچنین ابزارهای ساده، به عنوان مثال، ps، kill، killall، who و غیره است. اولی چون خیلی ساده است، دومی اینکه htop بهتر است. ما بر روی کار با برنامه htop و آنالوگ های آن در قالب ابزارهای سبک GNU، یک ابزار - یک تابع تمرکز خواهیم کرد.

بیایید htop را نصب کنیم اگر قبلاً آن را نصب نکرده اید. در اوبونتو این کار به صورت زیر انجام می شود:

sudo apt نصب htop

در سایر توزیع ها فقط باید از مدیر بسته خود استفاده کنید. نام پکیج یکسان است.

مشاهده فرآیندهای در حال اجرا

این یک کار بسیار ساده است و همچنین به راحتی قابل حل است. ابزارهای زیادی برای این کار وجود دارد، از ps معمولی گرفته تا بالا تعاملی پیشرفته تر، htop و غیره.

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

می توانید اطلاعات زیر را در مورد فرآیند مشاهده کنید:

  • PID- شناسه فرآیند
  • کاربر- کاربری که فرآیند از او راه اندازی شده است
  • PRI- اولویت فرآیند لینوکس در سطح هسته (معمولا NI+20)
  • NI- اولویت اجرای فرآیند از -20 تا 19
  • اس- وضعیت فرآیند
  • CPU- منابع CPU استفاده شده
  • MEM- حافظه استفاده شده
  • زمان- زمان اجرای فرآیند

می توانید پارامترهای اضافی را به صفحه نمایش اضافه کنید، اما اینها پارامترهای اصلی هستند. با استفاده از منوی Setup می توانید پارامترها را اضافه کنید. همه چیز در آنجا بسیار ساده است، نکات را بخوانید و دستورالعمل ها را دنبال کنید. به عنوان مثال، پارامتر PPID اضافه شده است:

یکی از ویژگی های بسیار مهم برنامه این است که می توانید پردازش ها را در لینوکس بر اساس پارامتر مورد نظر مرتب کنید. کافیست روی نام پارامتر کلیک کنید، به رنگ سبز مشخص شده و مرتب سازی انجام می شود. به عنوان مثال، اگر می خواهید ببینید فرآیندها به چه ترتیبی راه اندازی شده اند، بر اساس PID مرتب کنید:

همچنین یک گزینه جالب برای ترتیب فرآیندها در یک درخت وجود دارد. شما قادر خواهید بود ببینید کدام فرآیند یک فرآیند خاص را شروع کرده است. برای نمایش درخت، دکمه F5 را فشار دهید:

با استفاده از برنامه ps می توانید تقریباً همان اقدامات را انجام دهید. فقط در اینجا چنین حالت تعاملی مناسبی وجود ندارد. همه چیز با استفاده از گزینه ها انجام می شود.

بیایید به گزینه های اصلی که استفاده خواهیم کرد نگاه کنیم:

  • -e- نمایش اطلاعات در مورد تمام فرآیندها
  • - نمایش اطلاعات در مورد تمام فرآیندهای اغلب درخواست شده
  • -t- فقط فرآیندهای این ترمینال را نشان دهید
  • - نمایش اطلاعات فقط در مورد فرآیند مشخص شده
  • -u- نمایش فرآیندهای تنها یک کاربر خاص

به طور خلاصه، برای مشاهده تمام فرآیندهای فعال فعلی در لینوکس، از ترکیبی از گزینه های aux استفاده کنید:

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

ps aux --sort=%mem

فهرست به ترتیب معکوس، با مقادیر بیشتر در پایین و کمتر در بالا مرتب می شود. اگر باید این کار را برعکس انجام دهید، یک منهای اضافه کنید:

ps aux --sort=-%cpu

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

به نظر می رسد که ps توانایی پردازش درختان را ندارد. اما نه واقعاً، یک دستور جداگانه برای این وجود دارد:

یافتن فرآیندها در لینوکس

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

برای یافتن فرآیند لینوکس در htop می توانید از دکمه F3 استفاده کنید. F3 را فشار دهید و کلمه مورد نظر را تایپ کنید. بعد، برای رفتن به ورودی بعدی، F2 یا Esc را فشار دهید تا جستجو کامل شود:

همچنین می توانید از فیلتر htop برای جستجوی فرآیندها در htop استفاده کنید. F4 را فشار دهید، یک کلمه وارد کنید، و فقط پردازش های لینوکس که نام آن کلمه را شامل می شود لیست می شوند.

هیچ فیلتری در ابزار ps وجود ندارد، اما می‌توانیم از ابزار grep استفاده کنیم و خروجی ps را به آن هدایت کنیم تا فرآیند لینوکس را پیدا کنیم:

ps aux | grep کروم

این یک دستور بسیار رایج است.

تغییر اولویت فرآیند

اولویت فرآیند لینوکس به این معنی است که چقدر زمان CPU بیشتری در مقایسه با سایر فرآیندها به آن فرآیند داده می شود. به این ترتیب می‌توانیم به‌طور دقیق تنظیم کنیم که کدام برنامه سریع‌تر و کدام برنامه کندتر اجرا شود. مقدار اولویت می تواند از 19 (حداقل اولویت) تا -20 - حداکثر اولویت فرآیند لینوکس باشد. علاوه بر این، می توانید اولویت را با حقوق یک کاربر معمولی کاهش دهید، اما برای افزایش آن به حقوق سوپرکاربر نیاز دارید.

htop از پارامتر Nice برای کنترل اولویت استفاده می کند. به شما یادآوری کنم که Priv فقط یک اصلاحیه است، در اکثر موارد 20 بیشتر از Nice است. برای تغییر اولویت یک فرآیند، به سادگی مکان نما را روی آن قرار دهید و دکمه F7 را فشار دهید تا تعداد را کاهش دهید (اولویت را افزایش دهید) یا F8 را تا تعداد را افزایش دهید

اما برای حل این وظیفه مدیریت فرآیندهای لینوکس، نیازی به استفاده از htop نیست. شما می توانید همه چیز را با دستورات دیگر انجام دهید. مثلا دستور nice. با استفاده از آن، می توانید اولویت را برای فرآیند راه اندازی مشخص کنید:

nice -n 10 apt-get upgrade

یا اولویت یک موجود را با pid آن تغییر دهید:

renice -n 10 -p 1343

خاتمه فرآیندها در لینوکس

اگر فرآیندی متوقف شده و پاسخگو نیست، باید خاتمه داده شود. در htop، برای از بین بردن یک فرآیند لینوکس، به سادگی مکان نما را روی فرآیند قرار دهید و F9 را فشار دهید:

سیستم از سیگنال‌های خاصی برای کنترل فرآیندها استفاده می‌کند؛ سیگنال‌هایی وجود دارند که پایان فرآیند را نشان می‌دهند. در اینجا چند سیگنال اساسی وجود دارد:

  • SIGKILL- از فرآیند بخواهید که داده ها را ذخیره کند و پایان یابد
  • SIGTERM- بلافاصله، بدون ذخیره، فرآیند را پایان دهید

به طور کلی، چندین ده سیگنال وجود دارد، اما ما آنها را در نظر نخواهیم گرفت. بیایید سیگنال SIGKILL را ارسال کنیم:

همچنین می توانید از ابزار kill استفاده کنید:

شما همچنین می توانید یک فرآیند را با نام آن را بکشید:

کشتن کروم

محدودیت فرآیند

مدیریت فرآیند در لینوکس به شما امکان می دهد تقریباً همه چیز را کنترل کنید. شما قبلاً دیده اید که چه کاری می توان انجام داد، اما حتی می توان کارهای بیشتری انجام داد. با استفاده از دستور ulimit و فایل پیکربندی /etc/security/limits.conf، می توانید دسترسی فرآیندها به منابع سیستم مانند حافظه، فایل ها و پردازنده را محدود کنید. به عنوان مثال، می توانید حافظه پردازش لینوکس، تعداد فایل ها و غیره را محدود کنید.

ورودی فایل به شکل زیر است:

<домен> <тип> <элемент> <значение>

  • دامنه- نام کاربری، نام گروه یا UID
  • نوع- نوع محدودیت - نرم یا سخت
  • عنصر- منبعی که محدود خواهد بود
  • معنی- حد مورد نیاز

محدودیت‌های سخت توسط سوپرکاربر تعیین می‌شوند و توسط کاربران عادی قابل تغییر نیستند. محدودیت های نرم را می توان توسط کاربران با استفاده از دستور ulimit تغییر داد.

بیایید به محدودیت های اصلی که می تواند برای فرآیندها اعمال شود نگاه کنیم:

  • هیچ فایل
  • مانند- حداکثر مقدار رم
  • پشته- حداکثر اندازه پشته
  • CPU- حداکثر زمان پردازنده
  • nproc- حداکثر تعداد هسته های پردازنده
  • قفل ها- تعداد فایل های مسدود شده
  • خوب- حداکثر اولویت فرآیند

به عنوان مثال، اجازه دهید زمان پردازنده را برای فرآیندهای کاربر sergiy محدود کنیم:

sergiy hard nproc 20

می توانید محدودیت های یک فرآیند خاص را در پوشه proc مشاهده کنید:

cat /proc/PID/Limits

حداکثر زمان cpu نامحدود ثانیه نامحدود
حداکثر اندازه فایل نامحدود بایت نامحدود
حداکثر اندازه داده نامحدود بایت نامحدود
حداکثر اندازه پشته 204800 بایت نامحدود
حداکثر اندازه فایل اصلی 0 بایت نامحدود
حداکثر مقیم مجموعه بایت های نامحدود نامحدود
حداکثر پردازش 23562 23562 پردازش
حداکثر فایل های باز 1024 4096 فایل
حداکثر حافظه قفل شده 18446744073708503040 18446744073708503040 بایت
حداکثر فضای آدرس نامحدود بایت نامحدود
فایل Max قفل های نامحدود و نامحدود را قفل می کند
حداکثر سیگنال در انتظار 23562 23562 سیگنال
حداکثر اندازه msgqueue 819200 819200 بایت
حداکثر اولویت خوب 0 0
حداکثر اولویت بیدرنگ 0 0
حداکثر زمان بیدرنگ نامحدود ما نامحدود

محدودیت هایی که به این روش تغییر کرده اند پس از راه اندازی مجدد اعمال خواهند شد. اما همچنین می‌توانیم با استفاده از دستور ulimit برای پوسته فعلی و فرآیندهایی که ایجاد می‌کند محدودیت‌هایی تعیین کنیم.

در اینجا گزینه های دستور هستند:

  • - حد نرم
  • -اچ- محدودیت سخت
  • - نمایش تمام اطلاعات
  • - حداکثر اندازه فایل های ایجاد شده
  • -n- حداکثر تعداد فایل های باز
  • -s- حداکثر اندازه پشته
  • -t- حداکثر زمان پردازنده
  • -u- حداکثر تعداد فرآیندهای در حال اجرا
  • -v- حداکثر مقدار حافظه مجازی

به عنوان مثال، می‌توانیم محدودیت جدیدی برای تعداد فایل‌هایی که می‌توانند باز شوند تعیین کنیم:

حالا بیایید نگاه کنیم:

بیایید محدودیت RAM را تعیین کنیم:

ulimit -Sv 500000

یادآوری می کنم که این محدودیت برای تمامی برنامه های اجرا شده در این ترمینال اعمال خواهد شد.

نتیجه گیری

همین. اکنون مدیریت فرآیندها در لینوکس برای شما مشکلی ایجاد نمی کند. ما این موضوع را با جزئیات زیاد بررسی کردیم. اگر سوال یا پیشنهادی برای افزودن به مقاله دارید، در نظرات بنویسید!

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

تیم بکشمی تواند برای از بین بردن یا خاتمه یک فرآیند با استفاده از "سیگنال" یا "PID" استفاده شود. دستور Kill سیگنال مشخص شده را برای خاتمه دادن به یک برنامه نادرست ارسال می کند. اگر سیگنالی مشخص نشده باشد، سیگنال TERM ارسال می شود. این سیگنال TERM فرآیندهایی را که آن را نمی گیرند، از بین می برد. برای سایر فرآیندها ممکن است لازم باشد از سیگنال Kill (شماره 9) استفاده شود زیرا این سیگنال قابل رهگیری نیست.

SIGTERM سیگنالی است که درخواست می کند یک فرآیند متوقف شود. به این فرآیند مدتی برای تکمیل کار داده می شود.

خوب، با کمک سیگنال SIGKILL، می توانیم فرآیند را مجبور به خاتمه فوری کنیم. و برنامه حق نادیده گرفتن این سیگنال را ندارد و برنامه را خاتمه می دهد.

فرمت دستور Kill به صورت زیر است:

کشتن [ -signal | سیگنال -s ] pid ...

ساده ترین راه برای از بین بردن یک فرآیند، یافتن PID منبع و سپس اجرای PID به عنوان آرگومان با دستور Kill است.

PID چیست؟

به هر فرآیند یا برنامه لینوکس یا یونیکس که اجرا می شود به طور خودکار یک شماره شناسایی فرآیند (PID) منحصر به فرد اختصاص داده می شود. PID به طور خودکار به هر فرآیند در سیستم یک عدد اختصاص می دهد.

شما می توانید PID یک منبع را با استفاده از دستور "pidof" یا دستور "ps" پیدا کنید. برای پیدا کردن PID یک فرآیند (مثلا فایرفاکس) از دستور زیر استفاده کنید

پیدوف فایرفاکس

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

Ps-A | grep -i فایرفاکس

در مثال بالا عدد “23814” نمایش داده می شود که PID فرآیند فایرفاکس است. هنگامی که PID فرآیند (فایرفاکس) را شناختید، می توانید از دستور Kill برای کشتن فرآیند (فایرفاکس) مانند شکل زیر استفاده کنید.

23814 را بکش

هنگامی که یک فرمان یک kill را اجرا می کند، یعنی یک سیگنال به فرآیندی که PID آن به همراه دستور به عنوان آرگومان ارسال می شود، ارسال می کند.

برای دقیق تر، دستور Kill دارای اشکال زیر است:

  • PID را بکش
  • کشتن -15 PID
  • کشتن -9 PID
  • kill -SIGTERM PID
  • kill -SIGTERM PID

دستور Kill دارای کدهای بازگشتی زیر است:

  • 0 - موفقیت
  • 1- شکست
  • 64 - موفقیت نسبی (اگر بیش از یک فرآیند مشخص شده باشد)

دستور دیگری که می توانید استفاده کنید این است همه را بکش. Killall همچنین از نام فرآیند به جای PID استفاده می کند و تمام نمونه های فرآیند را با آن نام خاتمه می دهد. به عنوان مثال، اگر چندین نمونه از فایرفاکس در حال اجرا دارید، می توانید همه آنها را با دستور خاموش کنید

فایرفاکس را بکش

برای سرور X دستور دیگری به نام وجود دارد Xkill، که می تواند فرآیندها را از بین ببرد. دستور Xkill برای حالت گرافیکی است، بدون ارسال نام فرآیند یا PID آن، یعنی اگر در ترمینال اجرا می‌کنید.


در این مقاله سعی می‌کنیم یک ماژول هسته ایجاد کنیم که بتواند PID یک فرآیند از قبل در حال اجرا در لینوکس را تغییر دهد و همچنین فرآیندهایی را که PID تغییر یافته دریافت کرده‌اند آزمایش کنیم.


هشدار: تغییر PID یک فرآیند غیر استاندارد است و تحت شرایط خاصی می تواند منجر به وحشت هسته شود.

ماژول تست ما دستگاه کاراکتر /dev/test را پیاده سازی می کند، که PID فرآیند را هنگام خواندن از آن تغییر می دهد. با تشکر از این مقاله برای نمونه ای از پیاده سازی دستگاه کاراکتر. کد کامل ماژول در انتهای مقاله آورده شده است. البته درست ترین راه حل اضافه کردن یک فراخوانی سیستم به خود کرنل بود، اما این نیاز به کامپایل مجدد کرنل دارد.

محیط

تمام فعالیت های تست ماژول در یک ماشین مجازی VirtualBox با توزیع 64 بیتی LInux و هسته نسخه 4.14.4-1 انجام شد. ارتباط با دستگاه با استفاده از SSH انجام شد.

راه حل ساده شماره 1 را امتحان کنید

چند کلمه در مورد جریان: متغیر فعلی به ساختار task_struct با توضیحی از فرآیند موجود در هسته (PID، UID، GID، cmdline، فضاهای نام و غیره) اشاره می‌کند.

ایده اول این بود که به سادگی پارامتر current->pid را از ماژول هسته به مورد دلخواه تغییر دهید.

استاتیک ssize_t device_read (فایل ساختار *filp، char *بافر، اندازه_t طول، loff_t * offset) (printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n"current->pid);، )
برای بررسی عملکرد ماژول، یک برنامه در C++ نوشتم:

#عبارتند از #عبارتند از #عبارتند از int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >> خ. std::cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
بیایید ماژول را با دستور insmod بارگذاری کنیم، /dev/test را ایجاد کرده و آن را امتحان کنیم.

# ./a.out PID پدر و مادر من 293 PID 782 من PID 782 جدید من
PID تغییر نکرده است. این ممکن است تنها جایی نباشد که PID در آن مشخص شده است.

فیلدهای PID اضافی شماره 2 را امتحان کنید

اگر current->pid شناسه فرآیند نیست، پس چیست؟ نگاهی سریع به کد getpid() به ساختار task_struct اشاره می کند که فرآیند لینوکس و فایل pid.c را در کد منبع هسته توصیف می کند. تابع مورد نیاز __task_pid_nr_ns است. در کد تابع یک فراخوانی task->pids.pid وجود دارد، ما این پارامتر را تغییر خواهیم داد

کامپایل و امتحان کنید

از آنجایی که من از طریق SSH تست کردم، توانستم خروجی برنامه را قبل از خراب شدن هسته دریافت کنم:

PID پدر و مادر من 293 PID من 1689 PID جدید من 1689
اولین نتیجه در حال حاضر چیزی است. اما PID هنوز تغییر نکرده است.

نمادهای هسته غیر قابل صادرات شماره 3 را امتحان کنید

با نگاهی دقیق تر به pid.c تابعی به دست می آید که آنچه ما نیاز داریم را انجام می دهد
static void __change_pid(struct task_struct *task, enum pid_type type,
ساختار pid *جدید)
تابع وظیفه ای را می پذیرد که برای آن نیاز به تغییر PID، نوع PID و در واقع PID جدید است. تابع یک PID جدید ایجاد می کند
struct pid *alloc_pid(struct pid_namespace *ns)

این تابع فقط فضای نامی را می پذیرد که PID جدید در آن قرار می گیرد، این فضا را می توان با استفاده از task_active_pid_ns به دست آورد.
اما یک مشکل وجود دارد: این نمادهای هسته توسط هسته صادر نمی شوند و نمی توانند در ماژول ها استفاده شوند. یک فوق العاده به من در حل این مشکل کمک کرد. کد تابع find_sym از آنجا گرفته شده است.

استاتیک asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); static asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST driver loaded!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ...) ssize_t استاتیک device_read(struct file * filp، char *buffer، size_t طول، loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current ,PIDTYPE_PID,newpid)؛ printk("PID جدید: %d.\n",current->pid)؛ ... )
کامپایل، راه اندازی

PID پدر و مادر من 299 PID 750 من PID 751 جدید من
PID تغییر کرد! هسته به طور خودکار یک PID رایگان را به برنامه ما اختصاص داد. اما آیا می توان از PID استفاده کرد که توسط فرآیند دیگری مانند PID 1 اشغال شده است؟ بیایید کد را بعد از تخصیص اضافه کنیم

Newpid->numbers.nr = 1;
کامپایل، راه اندازی

PID والد من 314 PID من 1172 PID جدید من 1
ما PID 1 واقعی را دریافت می کنیم!

Bash اشکالی ایجاد کرده است که از تغییر کار با استفاده از دستور %n جلوگیری می کند، اما همه عملکردهای دیگر به خوبی کار می کنند.

ویژگی های جالب فرآیندهای با تغییر PID

PID 0: enter نمی تواند خارج شود

بیایید به کد بازگردیم و PID را به 0 تغییر دهیم.

Newpid->numbers.nr = 0;
کامپایل، راه اندازی

PID284 پدر و مادر من PID 1517 من PID جدید من 0
بنابراین PID 0 آنقدر خاص نیست؟ ما شادی می کنیم، می نویسیم خروج و...

گلوله توپ در حال سقوط است! هسته وظیفه ما را به عنوان IDLE TASK تعریف کرد و با دیدن تکمیل، به سادگی خراب شد. ظاهراً، برنامه ما قبل از خروج باید به PID "عادی" خود بازگردد.

فرآیند نامرئی

بیایید به کد بازگردیم و یک PID تنظیم کنیم که تضمین شده است اشغال نشود
newpid->numbers.nr = 12345;

کامپایل، راه اندازی

PID296 پدر و مادر من PID 735 PID جدید من 12345
بیایید ببینیم در /proc چه چیزی وجود دارد

1 148 19 224 288 37 79 86 93 کنسول های fb kcore قفل پارتیشن ها تعویض نسخه 10 149 2 226 29 4 8 87 acpi cpuinfo فایل سیستم ها کاربران کلیدی meminfo sched_debug 29 2010 88 as ound crypto fs keys misc schedstat sysrq - ماشه vmstat 11 16 208 24 291 6 81 89 دستگاه های buddyinfo ماژول های kmsg را قطع می کند scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts self 67213 3 90 cgroup s dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms up pagetype
همانطور که می بینیم، /proc فرآیند ما را شناسایی نمی کند، حتی اگر یک PID رایگان را اشغال کرده باشیم. PID قبلی نیز در /proc نیست و این بسیار عجیب است. شاید ما در فضای نام دیگری هستیم و بنابراین برای main /proc قابل مشاهده نیستیم. بیایید یک /proc جدید سوار کنیم و ببینیم چه چیزی وجود دارد

1 14 18 210 25 291 738 81 9 دستگاه های گذرگاهی fs key-users locks pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats t29 29 diskstats info part 10 27 30 76 83 92 cmdline dma iomem kmsg متفرقه sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz drivers ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acpi consoles moulunts infosq . 1 3 17 208 23 29 6 8 86 asound cpuinfo fb ​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 file systems crypto buddyinfo kcore loadavg net slabinfo thread-self zoneinfo
فرآیند ما هنوز وجود ندارد، به این معنی که ما در فضای نام معمولی هستیم. بیایید بررسی کنیم

Ps -e | grep bash
296 امتیاز/ 0 00:00:00 بش

فقط یک بش که از آن برنامه را راه اندازی کردیم. نه PID قبلی و نه فعلی در لیست نیست.

ما به شما نشان خواهیم داد که چگونه یک فرآیند را در لینوکس از بین ببرید. یکی از مزیت های اصلی لینوکس، امکان خاتمه دادن به یک فرآیند بدون نیاز به راه اندازی مجدد سرور است. در این مقاله به شما نشان خواهیم داد که چگونه با استفاده از دستور kill، pkill و killall یک فرآیند را در لینوکس از بین ببرید.

1. PID چیست

قبل از شروع، باید بدانیم شناسه فرآیند (PID) چیست.

PID نشان دهنده شناسایی دیجیتالی یک فرآیند در است. هر فرآیند یک PID منحصر به فرد دارد. در واقع، برای مثال، اولین فرآیندی که در یک سیستم مبتنی بر لینوکس شروع می شود، یک فرآیند است و PID آن بر روی 1 تنظیم می شود. این فرآیند، والد تمام فرآیندهای دیگر است. فرآیند init را نمی توان با استفاده از دستورات kill از بین برد، و این تضمین می کند که به طور تصادفی کشته نمی شود.

اکنون برای یافتن PID هر فرآیند در حال اجرا در سرور، می‌توانیم دستور زیر را اجرا کنیم:

این لیستی از تمام فرآیندهای در حال اجرا و PID مربوط به آنها را به ما می دهد.

اگر بخواهیم PID یک فرآیند خاص را پیدا کنیم، می‌توانیم از دستور pidof و به دنبال آن نام فرآیند استفاده کنیم. به عنوان مثال، برای پیدا کردن PID فرآیند MySQL، می‌توانید دستور زیر را اجرا کنید:

Pidof mysql

برای اطلاعات دقیق تر، می توانیم از دستور استفاده کنیم ps auxبا هم grep:

PS aux | grep mysql

اکنون که می دانیم PID چیست و چگونه می توان PID یک فرآیند خاص را پیدا کرد، می توانیم به بخش بعدی برویم و یاد بگیریم که چگونه آن را از بین ببریم.

2. یک فرآیند را با استفاده از دستور kill در لینوکس بکشید

چند قانون مهم وجود دارد که قبل از شروع استفاده از دستور kill باید بدانیم.

  • شما فقط می توانید فرآیندهای بومی که متعلق به شناسه کاربری شما هستند را از بین ببرید
  • شما نمی توانید فرآیندهای کاربران دیگر را از بین ببرید
  • شما نمی توانید فرآیندهای سیستم را از بین ببرید (مگر اینکه ابرکاربر باشید)
  • کاربر ریشه می تواند فرآیند هر کاربر دیگر و هر فرآیند سیستمی را از بین ببرد

وقتی فرآیندی را با دستور kill می کشیم، در واقع سیگنال PID خاصی را که می خواهیم بکشیم ارسال می کنیم. سیگنال های زیر توسط دستور kill استفاده می شود:

1 = قطع کردن 9 = کشتن 15 = خاتمه دادن

سیگنال قطع به ندرت استفاده می شود. اغلب ما از سیگنال kill استفاده می کنیم و اگر کار نکرد، می توانیم از سیگنال پایان استفاده کنیم.

بنابراین وقتی PID فرآیندی را که می‌خواهیم بکشیم پیدا کردیم، از یکی از روش‌هایی که قبلا توضیح دادیم استفاده کنیم، می‌توانیم از دستور استفاده کنیم. کشتن -9 PIDبرای از بین بردن فرآیند از آن PID خاص.

به عنوان مثال، اگر PID 6738 باشد، می توانیم از دستور زیر استفاده کنیم:

کشتن -9 6738

3. یک فرآیند را با استفاده از دستور pkill در لینوکس بکشید

اگر می خواهید از نام فرآیند به جای PID برای از بین بردن آن استفاده کنید، می توانید از دستور pkill استفاده کنید. برای مثال، اگر فرآیندی که می‌خواهیم بکشیم نامیده می‌شود، می‌توانیم از دستور زیر برای کشتن آن استفاده کنیم:

mysql را Pkill کنید

4. یک فرآیند را با استفاده از دستور killall در لینوکس بکشید

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

mysql را بکشید

در این مثال، ما فرآیند MySQL و تمام پردازش های فرزند آن را می کشیم.

آنها رایج ترین نمونه های کشتن فرآیند در لینوکس هستند.

بهترین مقالات در این زمینه