مقدمه
برای درک مفهوم پراسس، یک تشبیه ساده را در نظر بگیرید. یک برنامه روی دیسک (مثلاً فایل
/bin/ls) مانند یک دستور آشپزی در یک کتاب است. این دستورالعملها به خودی خود غیرفعال
هستند و کاری انجام نمیدهند. یک پراسس (Process) یا فرآیند، زمانی ایجاد میشود که کامپیوتر
در حال اجرای آن دستور آشپزی است. به عبارت دیگر، پراسس، یک برنامه در حال اجراست.
هر کاری که در سیستم لینوکس خود انجام میدهید، از اجرای یک دستور ساده در ترمینال گرفته تا باز
کردن یک مرورگر وب یا اجرای سرویسهای پسزمینه توسط سیستم، یک یا چند پراسس ایجاد میکند. مدیریت
این پراسسها - یعنی مشاهدهی آنها، متوقف کردنشان در صورت نیاز و تغییر اولویتشان - یکی از
مهارتهای اصلی برای عیبیابی و مدیریت سیستم لینوکس است.
مشاهدهی پراسسها با دستور ps
ابزار اصلی برای مشاهدهی وضعیت پراسسهای در حال اجرا، دستور ps (مخفف Process
Status) است. اگر این دستور را بدون هیچ گزینهای اجرا کنید، معمولاً فقط پراسسهای مربوط به
ترمینال فعلی خودتان را نمایش میدهد که چندان مفید نیست. برای دیدن تمام پراسسهای در حال اجرا در
سیستم، از ترکیبهای خاصی از گزینهها استفاده میکنیم. دو سبک رایج برای این کار وجود دارد:
- سبک BSD (بدون خط تیره): مانند ps aux. این سبک محبوبترین و جامعترین روش
است.
- سبک UNIX (با خط تیره): مانند ps -ef. این سبک اطلاعات را کمی متفاوت نمایش
میدهد و برای دیدن رابطهی والد-فرزندی بین پراسسها مفید است.
سبک BSD: دستور ps aux
این دستور یک لیست جامع از تمام پراسسهای در حال اجرا را نمایش میدهد. ستونهای مهم خروجی آن به
شرح زیر است:
ستون |
توضیح |
USER |
کاربری که پراسس را اجرا کرده است. |
PID |
Process ID. یک شمارهی شناسایی منحصربهفرد برای هر پراسس. این مهمترین
شناسه برای مدیریت یک پراسس است. |
%CPU |
درصد استفاده از پردازنده (CPU). |
%MEM |
درصد استفاده از حافظه (RAM). |
STAT |
وضعیت (Status) پراسس. مانند R (در حال اجرا)، S (در حال خواب
- منتظر رویداد) یا Z (زامبی). |
COMMAND |
دستور یا برنامهای که این پراسس را آغاز کرده است. |
سبک UNIX: دستور ps -ef
این سبک نیز تمام پراسسها را لیست میکند اما یک ستون بسیار مهم به نام PPID دارد.
ستون |
توضیح |
UID |
شناسهی کاربری (User ID) مالک پراسس. |
PID |
شناسهی پراسس (Process ID). |
PPID |
Parent Process ID. شناسهی پراسسِ والدی که این پراسس را ایجاد کرده
است. این ستون به ما کمک میکند تا سلسله مراتب پراسسها را ببینیم. |
CMD |
دستوری که پراسس را آغاز کرده است. |
در لینوکس، تمام پراسسها یک ساختار درختی دارند. جد بزرگ تمام پراسسها، پراسسی با PID=1
است که معمولاً systemd یا init نام دارد و اولین پراسسی است که هنگام بوت
شدن سیستم اجرا میشود.
خاتمه دادن به یک پراسس با دستور kill
گاهی اوقات یک برنامه هنگ میکند یا به دلایلی لازم است یک پراسس را به صورت دستی متوقف کنیم. دستور
kill برای این کار طراحی شده است. برخلاف نامش، کار اصلی این دستور «ارسال سیگنال» به یک
پراسس است. ما با استفاده از PID، پراسس مورد نظر را مشخص کرده و به آن سیگنال
میفرستیم.
سیگنال پیشفرض، SIGTERM (با شماره ۱۵) است که یک درخواست «مؤدبانه» برای خاتمه دادن به
پراسس است. این سیگنال به برنامه فرصت میدهد تا کارهای خود را تمام کرده، فایلهایش را ذخیره کند و
به صورت تمیز خارج شود.
$ ps aux | grep firefox
me 12345 4.5 8.1 345678 123456 ? Sl 10:30 2:05 firefox
$ kill 12345
حذف اجباری: سیگنال SIGKILL
گاهی یک پراسس به قدری دچار مشکل شده که به سیگنال مؤدبانهی SIGTERM پاسخ نمیدهد. در
این موارد، ما به سراغ سیگنال SIGKILL (با شماره ۹) میرویم. این سیگنال یک دستور
خاتمهی «اجباری» و بدون قید و شرط است که پراسس نمیتواند آن را نادیده بگیرد.
$ kill -9 12345
$ kill -SIGKILL 12345
⚠️ احتیاط در استفاده از kill -9
استفاده از SIGKILL باید همیشه به عنوان آخرین راه حل در نظر گرفته شود. این سیگنال
به برنامه هیچ فرصتی برای پاکسازی نمیدهد و میتواند منجر به از دست رفتن دادهها یا باقی
ماندن فایلهای موقت روی سیستم شود. همیشه ابتدا با یک kill عادی امتحان کنید و فقط
در صورت عدم پاسخ، از kill -9 استفاده نمایید.
علاوه بر kill، ابزارهای راحتتری مانند pkill و killall نیز وجود
دارند که به شما اجازه میدهند پراسسها را بر اساس نامشان خاتمه دهید، نه PID. برای
مثال: pkill firefox.