مقدمه

برای درک مفهوم پراسس، یک تشبیه ساده را در نظر بگیرید. یک برنامه روی دیسک (مثلاً فایل /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.