گاهی یک Process در لینوکس باعث مصرف بیش از حد CPU، اشغال حافظه RAM یا اختلال در اجرای سرویسهای سرور میشود. در این آموزش یاد میگیرید چگونه Process های فعال را پیدا کنید، PID آنها را مشاهده کنید و با دستور kill در لینوکس پردازشهای مشکلدار را متوقف کنید.
در سیستمعامل لینوکس گاهی ممکن است یک برنامه، سرویس یا اسکریپت بهدرستی متوقف نشود و باعث مصرف بیش از حد منابع سرور شود. برای مثال ممکن است یک Process باعث افزایش مصرف CPU، اشغال حافظه RAM یا اختلال در اجرای سرویسهای دیگر شود. در چنین شرایطی مدیر سرور باید بتواند پردازش موردنظر را پیدا کرده و در صورت نیاز آن را متوقف کند. در این آموزش یاد میگیریم چگونه در لینوکس Process ها را مشاهده کنیم، PID هر پردازش را پیدا کنیم و با استفاده از دستور kill در لینوکس یک پردازش را متوقف کنیم.
Process در لینوکس چیست؟
در لینوکس هر برنامه یا سرویسی که در حال اجرا باشد، یک Process محسوب میشود. زمانی که یک برنامه اجرا میشود، سیستمعامل یک پردازش ایجاد کرده و منابعی مانند:
CPU
حافظه RAM
فایلها
ارتباطات شبکه
را در اختیار آن قرار میدهد. برای مثال موارد زیر همگی Process هستند:
سرویس Nginx
دیتابیس MySQL
Apache
اسکریپتهای PHP
Cron Job ها
برنامههای Python
در یک سرور لینوکسی معمولاً صدها Process همزمان در حال اجرا هستند.
Kill Process در لینوکس چیست؟
Kill Process در لینوکس به معنی ارسال یک Signal به یک پردازش برای متوقف کردن یا خاتمه دادن اجرای آن است. برخلاف تصور رایج، دستور kill همیشه به معنی بستن اجباری برنامه نیست. این دستور میتواند Signalهای مختلفی برای یک Process ارسال کند و رفتار نهایی به Signal انتخابشده بستگی دارد. در حالت عادی، زمانی که دستور kill PID اجرا میشود، سیگنال SIGTERM برای پردازش ارسال میشود. این سیگنال از برنامه میخواهد اجرای خود را بهصورت کنترلشده متوقف کند. در نتیجه برنامه فرصت دارد فایلهای باز را ببندد، اطلاعات لازم را ذخیره کند و منابعی که در اختیار دارد آزاد کند. اگر یک Process پاسخگو نباشد و با روش عادی متوقف نشود، میتوان از Signalهای قویتری مانند SIGKILL استفاده کرد. با این حال، توقف اجباری باید آخرین گزینه باشد.
PID چیست؟
هر Process در لینوکس یک شناسه اختصاصی دارد که با نام PID (Process ID) شناخته میشود. PID یک عدد منحصربهفرد است که سیستمعامل برای شناسایی هر پردازش استفاده میکند. برای مثال:
nginx1542mysql2318php4521
در این مثال: 1542 شناسه Process مربوط به Nginx است. 2318 شناسه Process مربوط به MySQL است. برای متوقف کردن یک Process معمولاً به PID آن نیاز داریم.
PID تا زمانی معتبر است که Process در حال اجرا باشد. پس از پایان یک پردازش، سیستمعامل میتواند همان شماره PID را در آینده به Process دیگری اختصاص دهد. به همین دلیل قبل از اجرای دستور kill بهتر است مطمئن شوید PID موردنظر هنوز متعلق به همان برنامهای است که قصد متوقف کردن آن را دارید. علاوه بر PID، هر پردازش میتواند دارای یک Parent Process ID یا PPID نیز باشد. PPID مشخص میکند چه پردازشی Process فعلی را ایجاد کرده است. این موضوع هنگام عیبیابی سرویسها و اسکریپتهایی که Processهای فرزند زیادی ایجاد میکنند، اهمیت دارد.
چگونه Process های در حال اجرا را مشاهده کنیم؟
استفاده از دستور ps:
یکی از سادهترین روشها برای مشاهده پردازشها استفاده از دستور:
در ستون PID میتوانید شناسه هر پردازش را مشاهده کنید.
در خروجی این دستور چند ستون مهم وجود دارد:
USER: کاربری که Process را اجرا کرده است.
PID: شناسه اختصاصی پردازش.
%CPU: میزان مصرف CPU توسط Process.
%MEM: درصد حافظه RAM مصرفشده.
COMMAND: برنامه یا دستوری که Process را ایجاد کرده است.
هنگام عیبیابی سرور معمولاً ستونهای %CPU، %MEM و PID بیشترین اهمیت را دارند. برای مثال اگر مصرف CPU سرور بهطور ناگهانی افزایش پیدا کند، میتوان از خروجی ps برای پیدا کردن Processهای پرمصرف و سپس بررسی PID آنها استفاده کرد.
جزئیات کامل گزینهها و نحوه نمایش Processها در مستندات دستور ps در دسترس است.
پیدا کردن Process خاص با grep:
اگر دنبال یک برنامه مشخص هستید میتوانید خروجی را فیلتر کنید. برای مثال پیدا کردن Nginx:
psaux|grepnginx
خروجی:
root1542nginx
در اینجا PID برابر با:
1542
است.
مشاهده Process ها با دستور top:
دستور:
top
یکی از ابزارهای محبوب مدیریت سرور لینوکس است. با استفاده از top میتوانید اطلاعات لحظهای موارد زیر را مشاهده کنید:
میزان مصرف CPU
مصرف RAM
تعداد Process ها
PID هر برنامه
برای خروج از محیط top کلید:
q
را فشار دهید.
استفاده از دستور htop برای مدیریت بهتر Process ها
اگر ابزار htop روی سرور نصب باشد، مدیریت پردازشها سادهتر میشود. نصب در Ubuntu:
aptinstallhtop
اجرا:
htop
در htop میتوانید:
در htop میتوانید:
Process ها را جستجو کنید.
مصرف منابع را ببینید.
پردازش را مستقیم متوقف کنید.
تفاوت ps، top و htop چیست؟
هر سه ابزار برای مشاهده Processهای لینوکس استفاده میشوند، اما کاربرد آنها یکسان نیست. دستور ps معمولاً یک Snapshot از وضعیت Processها در همان لحظه ارائه میدهد و برای جستجو، فیلتر کردن و استفاده در اسکریپتها بسیار مناسب است.
در مقابل، top اطلاعات را بهصورت لحظهای بهروزرسانی میکند و برای بررسی مصرف CPU و RAM در زمان بروز مشکل کاربرد بیشتری دارد.
htop نیز عملکردی مشابه top دارد، اما رابط تعاملی و خواناتری ارائه میدهد و امکان جستجو، مرتبسازی و مدیریت Processها را سادهتر میکند.
چگونه یک Process را در لینوکس متوقف کنیم؟
بعد از پیدا کردن PID میتوانیم آن Process را متوقف کنیم.
killPID
مثلاً:
kill1542
در این مثال Process شماره 1542 متوقف میشود.
تفاوت kill و kill -9 در لینوکس
دستور kill به صورت پیشفرض یک سیگنال استاندارد ارسال میکند:
SIGTERM
این روش اجازه میدهد برنامه قبل از بسته شدن، عملیات خود را کامل کند. اما اگر Process پاسخگو نباشد، میتوان از:
kill-9PID
در این حالت:
SIGKILL
ارسال شده و Process فوراً متوقف میشود. توجه کنید که استفاده مداوم از kill -9 پیشنهاد نمیشود، زیرا برنامه فرصت ذخیره اطلاعات یا انجام عملیات پایانی را ندارد.
هنگام استفاده از pkill یا killall باید دقت بیشتری داشته باشید، زیرا برخلاف kill که معمولاً یک PID مشخص را هدف قرار میدهد، این دستورات ممکن است چند Process را همزمان متوقف کنند. برای مثال اگر چند Process با نام یکسان در حال اجرا باشند، اجرای pkill nginx میتواند روی همه Processهای منطبق اثر بگذارد. به همین دلیل در سرورهای Production بهتر است قبل از اجرای این دستورات، Processهای موردنظر را بررسی کنید.
برای بعضی سرویسها میتوانید مستقیماً PID را پیدا کنید. مثلاً:
pidofnginx
خروجی:
1542
سپس:
kill1542
متوقف کردن Process با نام برنامه
گاهی میتوان Process ها را با نام برنامه متوقف کرد. برای مثال:
pkillnginx
این دستور تمام Process هایی که نام nginx دارند را متوقف میکند. همچنین:
killallnginx
نیز برای همین کاربرد استفاده میشود.
چگونه Process های پرمصرف را پیدا کنیم؟
اگر سرور شما کند شده است، ابتدا باید Process های پرمصرف را پیدا کنید. استفاده از:
top
یا:
htop
به شما کمک میکند Process هایی که بیشترین مصرف CPU یا RAM دارند را شناسایی کنید. برای بررسی مصرف CPU:
psaux--sort=-%cpu
برای بررسی مصرف RAM:
psaux--sort=-%mem
نمونه عملی پیدا کردن و متوقف کردن یک Process پرمصرف
فرض کنید مصرف CPU سرور بهطور ناگهانی افزایش پیدا کرده است. ابتدا میتوانیم با دستور زیر وضعیت Processها را بررسی کنیم:
top
فرض کنید در خروجی مشاهده میکنیم Process با PID برابر 4210 بیشترین CPU را مصرف میکند. قبل از متوقف کردن آن بهتر است اطلاعات بیشتری درباره Process بررسی کنیم:
ps-p4210-opid,user,%cpu,%mem,cmd
با این دستور میتوانیم مطمئن شویم PID مربوط به چه برنامهای است و چه کاربری آن را اجرا کرده است.
اگر بعد از بررسی مشخص شد Process مشکلدار است، ابتدا توقف عادی را امتحان میکنیم:
kill4210
سپس با دستور زیر بررسی میکنیم که Process همچنان فعال است یا خیر:
ps-p4210
اگر Process همچنان فعال بود و به SIGTERM پاسخ نداد، در آخرین مرحله میتوانیم از:
kill-94210
استفاده کنیم. این روش بهتر از آن است که بدون بررسی مستقیماً kill -9 اجرا شود، زیرا ابتدا هویت Process و وضعیت آن بررسی میشود.
مدیریت Process ها در سرور مجازی لینوکس
در سرورهای مجازی معمولاً Process های زیادی برای اجرای سرویسها فعال هستند. مدیریت صحیح Process ها کمک میکند:
در این آموزش یاد گرفتیم چگونه در لینوکس یک Process را پیدا و متوقف کنیم. با یادگیری Kill Process در لینوکس میتوانید کنترل بیشتری روی سرویسها و منابع سرور داشته باشید. مهمترین دستورات: مشاهده Process ها:
psaux
مشاهده لحظهای پردازشها:
top
پیدا کردن PID:
pidofprogram
متوقف کردن Process:
killPID
توقف اجباری:
kill-9PID
با استفاده از این دستورات میتوانید کنترل بیشتری روی پردازشهای سرور لینوکسی خود داشته باشید
سوالات متداول از Kill Process در لینوکس:
تفاوت kill و kill -9 چیست؟
kill بهصورت پیشفرض سیگنال SIGTERM میفرستد و به برنامه فرصت میدهد بهصورت صحیح بسته شود. kill -9 از SIGKILL استفاده میکند و پردازش را فوراً متوقف میکند؛ بنابراین بهتر است فقط زمانی استفاده شود که پردازش به روش عادی متوقف نمیشود.
اگر دستور kill پردازش را متوقف نکرد چه کار کنیم؟
ابتدا مطمئن شوید PID صحیح است و دسترسی لازم را دارید. در صورت پاسخگو نبودن Process میتوانید در مرحله بعد از kill -9 PID استفاده کنید.
تفاوت kill، pkill و killall چیست؟
kill معمولاً بر اساس PID عمل میکند، در حالی که pkill و killall امکان متوقف کردن پردازشها بر اساس نام را فراهم میکنند.
چگونه Process پرمصرف را در لینوکس پیدا کنیم؟
میتوانید از top، htop یا دستورهای ps aux --sort=-%cpu و ps aux --sort=-%mem برای شناسایی پردازشهای پرمصرف استفاده کنید.
آیا استفاده از kill -9 خطرناک است؟
ذاتاً خطرناک نیست، اما چون برنامه فرصت ذخیره اطلاعات یا انجام Cleanup را ندارد، ممکن است در بعضی برنامهها باعث از دست رفتن داده یا باقی ماندن وضعیت ناسالم شود.
برای اجرای kill به دسترسی root نیاز داریم؟
کاربر معمولاً میتواند Processهای متعلق به خودش را متوقف کند. برای متوقف کردن پردازش متعلق به کاربران دیگر یا بعضی سرویسهای سیستمی، معمولاً به sudo یا دسترسی root نیاز است.