زمانی که یک پردازش در سیستم عامل لینوکس(Linux)، پاسخی را بازگردانی نمیکند و یا منابع سخت افزاری زیادی از سیستم ما را مصرف میکند، شاید متوقف کردن یا به اصطلاح Kill کردن آن تنها گزینه موجود باشد. بسیاری از پردازش ها، راهکار مختص به خود را برای متوقف شدن دارند. متأسفانه، ممکن است پردازش ها دچار نقص شده و یا وارد کردن یک دستور به صورت دستی نیاز باشد تا بتوان آن ها را متوقف کرد.
در این آموزش با طریقه متوقف کردن پردازش یا Kill Process در لینوکس(Linux)، آشنا میشویم.
چگونه Process ID یا Process Name را پیدا کنیم
قبل از متوقف کردن یک پردازش نیاز است تا موقعیت آن و یا محل قرارگیری آن را پیدا کنید. این کار از طریق پیدا کردن نام پردازش در حال انجام (Process Name) و یا ID مربوط آن (Process ID یا PID) امکان پذیر میباشد.
چند راه مختلف برای پیدا کردن یک پردازش یا process در لینوکس وجود دارد:
- از طریق دستور ps
- از طریق دستورات pgrep یا pidof
- و یا از طریق دستورات top در لینوکس
پیدا کردن process با استفاده از دستور ps
دستور ps، یک لیست کامل از پردازش های در حال اجرا، بر اساس گزینه ای که مقابل آن وارد میکنیم، به ما نمایش میدهد.
ps [option]
هر گزینه یک ویژگی خاص دارد و در صورت ورود، یک کار خاص انجام میدهد. گزینه هایی که میتوانیم در مقابل دستور ps وارد کنیم به این صورت است:
- گزینه -a. نمایش تمام process های مربوط به تمام کاربران سیستم
- گزینه -u. ارائه اطلاعات مفصل، از هر process در سیستم
- گزینه -x. ارائه process های که توسط daemon ها (برنامه هایی که از زمان بوت شدن سیستم اجرا شده و کاربر کنترلی به آن ها ندارد) کنترل میشوند و نه کاربران سیستم
برای مثال، دستور ps -aux یک لیست کامل از تمامی process ها، با جزئیات آن ارسال میکند:

پیدا کردن Process ID یا PID با استفاده از دستورات pgrep یا pidof
دستور pgrep در لینوکس، یک راه پیچیده تر برای پیدا کردن یک process میباشد. دستور pgrep، پردازش ها را بر اساس یک معیار انتخاب خاص به نام الگو یا pattern، بازگردانی میکند. الگو (pattern)، درواقع یک یک عبارت منظم است. برای مثال در الگوی a*، علامت * به معنای هرچیزی به جای هر تعداد کاراکتر است.
pgrep [options] [pattern]
گزینه های مربوط به دستور pgrep، به این صورت است:
- گزینه -l. ارائه لیستی از نام process ها و PID آنها
- گزینه -n. نمایش جدیدترین process
- گزینه -o. نمایش قدیمیترین process
- گزینه -u. نمایش process های مربوط به یک کاربر خاص در سیستم
- گزینه -x. نمایش process هایی که با الگوی داده شده، کاملا یکسان باشند
برای مثال، دستور pgrep -l -u root نام process ها و PID های مربوط به کاربر root در سیستم را نمایش میدهد:

دستور pidof، برای پیدا کردن Process ID یا PID با دادن نام process به آن میباشد.
pidof [options] [program]
برخی از گزینه های مربوط به دستور pidof، به این صورت است:
- گزینه -o. متوقف سازی با استفاده از PID
- گزینه -s. نمایش تنها یک PID
- گزینه -x. نمایش PID اسکریپت هایی که توسط مترجم های سیستم، در حال اجرا میباشند
برای مثال، جهت دریافت PID مربوط به پردازش sshd، دستور pidof sshd را اجرا میکنیم:

پیدا کردن process های در حال اجرا با استفاده از دستور top
دستور top، ساده ترین راه برای دریافت اطلاعات کامل از process های در حال اجرا میباشد. برای مشاهده یک لیست کامل از process های در حال اجرا، از این دستور استفاده میکنیم:
top
با اجرای این دستور، یک حالت تعاملی در از دستور top ایجاد میشود که به ما اطلاعات مختلفی مانند؛ PID ها، کاربرهای مربوط به آن process، مقدار منابع سخت افزاری (CPU و memory) که توسط هر process مصرف میشود و همچنین زمان اجرای آن را نمایش میدهد.

برای خروج از محیط مربوط به دستور top، از کلید q استفاده میکنیم.
چطور یک process را kill کنیم
در حقیقت kill کردن process یا پردازش، به معنای اتمام دادن به آن در سیستم میباشد. برای اینکار، ابتدا از دسترسی های لازم برخوردار شوید و مطمئن شوید که، دسترسی کاربری شما، قادر به انجام این کار میباشد.
یک کاربر root میتواند تمامی process ها را kill کند. پس از عبارت sudo، قبل از اجرای هر دستور برای اتمام دادن به یک پردازش استفاده کنید تا به عنوان کاربر root آن دستور را اجرا کنید و یا اینکه قبل از اجرای دستورات، به عنوان کاربر root وارد محیط shell شوید.
اتمام دادن یا kill کردن یک process، یک پیام به process مورد نظر برای دستور به پایان آن ارسال میکند. این پیام ها را، پیام های termination مینامیم. چندین نوع پیام termination مختلف وجود دارد:
- پیام SIGKILL. یک راه عالی برای دستور اتمام به یک process. در این حالت یک process، به صورت ناگهانی و همراه با یک پیام خطا، اتمام پیدا میکند. SIGKILL راهی است که همیشه باید کار کند. در صورتی که SIGKILL کار نکند، به معنای این است که سیستم عامل دچار خطا و مشکل شده است.
- پیام SIGTERM. برخلاف SIGKILL، این پیام ممکن است مسدود یا به نوعی دیگر مدیریت شود. این پیام برای اتمام دادن به یک process در سیستم کاربرد دارد و یک راه نسبتا آرام تر برای این کار است.
برای بیشتر کاربرد ها، SIGKILL یک روش کاربردی تر و سریعتر برای اتمام یک process میباشد.
دستور killall
دستور killall، با دریافت نام process به آن اتمام میدهد و یا به اصطلاح آن را kill میکند. به صورت پیشفرض، این دستور یک پیام SIGTERM را برای انجام این کار ارسال میکند. همچنین killall، قابلیت اتمام چندین process به صورت همزمان با یک ورود یک دستور را دارد.
killall [process]
دستور killall شامل چندین گزینه مختلف است:
- گزینه -e. علاوه بر پردازش نام برده شده، پردازش های همنام آن را نیز متوقف میکند
- گزینه -I. نام process ها را بدون بررسی کوچک یا بزرگ بودن حروف آن (یا به اصطلاح case sensitive)، در نظر گرفته و آن را متوقف میسازد
- گزینه -i. قبل از اتمام دادن به یک process، درمورد اطمینان داشتن از تصمیم برای اتمام به آن از کاربر سوال میپرسد. پس از تایید کاربر، دستور اجرا میشود
- گزینه -u. فقط process های مربوط به یک کاربر را متوقف میکند
- گزینه -v. پس از اتمام روند توقف process، یک پیام مبنی بر موفقیت آمیز بودن عملیات بازگردانی میکند
علاوه بر قابلیت اتمام process ها با استفاده از نام پردازش یا process، دستور killall قابلیت اتمام process ها بر اساس سن آنها را نیز دارد.
- گزینه -o. تمامی process هایی که عمر شروع آن ها، بیشتر از مقدار زمان اشاره شده به آن است را به اتمام میرساند
- گزینه -y. تمامی process هایی که عمر شروع آن ها، کمتر از مقدار زمان اشاره شده به آن است را به اتمام میرساند
برای مثال دستور killall -o 15m، تمامی پردازش ها process هایی که عمر آن بیشتر از 15 دقیقه است را به اتمام میرساند و دستور killall -y 15m، تمامی process هایی که عمر آن ها کمتر از 15 دقیقه است را به اتمام میرساند.
دستور pkill
دستور pkill، مشابه با دستور pgrep که با استفاده از نام process، آن را اتمام میدهد میباشد. به صورت پیشفرض، دستور pkill، یک پیام SIGTERM ارسال میکند:pkill [options] [pattern]
گزینه های مربوط به دستور pkill، به این صورت میباشد:
- گزینه -n. فقط جدیدترین process را اتمام میدهد
- گزینه -o. فقط قدیمی ترین process را اتمام میدهد
- گزینه -u، فقط process ای که مربوط به آن کاربر باشد را اتمام میدهد
- گزینه -x، فقط process ای را که دارای الگو یکسان باشد را اتمام میدهد
- گزینه -signal، به جای پیام پیشفرض SIGTERM، یک پیام خاص را به آن process ارسال میکند
به عنوان مثال، این دستور جدیدترین process ایجاد شده توسط کاربر root را اتمام میدهد:
pkill -n -u root
دستور xkill
دستور xkill، یک دستور خاص برای قطع ارتباط میان یک سرور و کاربران آن میباشد.
xkill [resource]
در صورتی که process های ناخواسته در سرور ایجاد شود، میتوانیم با استفاده از xkill آنها را متوقف کنیم.
همچنین اگر دستور xkill را بدون هیچ ورودی اجرا کنیم، یک رابط جدید برای کاربر باز میشود تا کاربر از آن طریق، اقدام به اتمام دادن process های مورد نظر خود کند.
دستور top
همانطور که توضیح دادیم، دستور top یک رابط از اطلاعات مربوط به process های در حال اجرا برای کاربر باز میکند.
top
همچنین این دستور قابلیت اتمام یک process را نیز دارد. بعد از اجرای دستور top، با فشار دادن کلید k و وارد کردن PID مربوط به یک process، میتوانیم آن را اتمام دهیم.