خانه » نحوه استفاده از ps، kill و nice برای مدیریت فرآیندها در لینوکس
آموزش لینوکس

نحوه استفاده از ps، kill و nice برای مدیریت فرآیندها در لینوکس

مقدمه

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

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

در این راهنما، برخی از جنبه‌های اساسی مدیریت فرآیند را خواهید آموخت. لینوکس تعدادی ابزار استاندارد و داخلی را برای این منظور ارائه می‌دهد.

شما این ایده‌ها را در محیط اوبونتو 20.04 بررسی خواهید کرد، اما هر توزیع مدرن لینوکس به روشی مشابه عمل خواهد کرد.

مرحله 1 – نحوه مشاهده فرآیندهای در حال اجرا در لینوکس
شما می‌توانید با استفاده از دستور top تمام فرآیندهای در حال اجرا روی سرور خود را مشاهده کنید:

top
Output
top - 15:14:40 up 46 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   316576k used,   703024k free,     7652k buffers
Swap:        0k total,        0k used,        0k free,   258976k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/0        
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        
    7 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0         
    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             
    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs          

چند خط اول خروجی، آمار سیستم، مانند بار CPU/حافظه و تعداد کل وظایف در حال اجرا را ارائه می‌دهد.

می‌توانید ببینید که ۱ فرآیند در حال اجرا و ۵۵ فرآیند که به دلیل عدم استفاده فعال از چرخه‌های CPU، در حالت خواب در نظر گرفته می‌شوند، وجود دارد.

بقیه خروجی نمایش داده شده، فرآیندهای در حال اجرا و آمار استفاده آنها را نشان می‌دهد. به طور پیش‌فرض، top به طور خودکار این فرآیندها را بر اساس میزان استفاده از CPU مرتب می‌کند، بنابراین می‌توانید ابتدا شلوغ‌ترین فرآیندها را مشاهده کنید. top در shell شما به اجرا ادامه می‌دهد تا زمانی که آن را با استفاده از ترکیب کلید استاندارد Ctrl+C برای خروج از یک فرآیند در حال اجرا متوقف کنید. این یک سیگنال kill ارسال می‌کند و به فرآیند دستور می‌دهد که در صورت امکان، به طور مناسب متوقف شود.

نسخه بهبود یافته top، به نام htop، در اکثر مخازن بسته موجود است. در اوبونتو ۲۰.۰۴، می‌توانید آن را با apt نصب کنید:

sudo apt install htop

پس از آن، دستور htop در دسترس خواهد بود:

htop
Output
  Mem[|||||||||||           49/995MB]     Load average: 0.00 0.03 0.05 
  CPU[                          0.0%]     Tasks: 21, 3 thr; 1 running
  Swp[                         0/0MB]     Uptime: 00:58:11

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 1259 root       20   0 25660  1880  1368 R  0.0  0.2  0:00.06 htop
    1 root       20   0 24188  2120  1300 S  0.0  0.2  0:00.56 /sbin/init
  311 root       20   0 17224   636   440 S  0.0  0.1  0:00.07 upstart-udev-brid
  314 root       20   0 21592  1280   760 S  0.0  0.1  0:00.06 /sbin/udevd --dae
  389 messagebu  20   0 23808   688   444 S  0.0  0.1  0:00.01 dbus-daemon --sys
  407 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.02 rsyslogd -c5
  408 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
  409 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
  406 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.04 rsyslogd -c5
  553 root       20   0 15180   400   204 S  0.0  0.0  0:00.01 upstart-socket-br

htop تجسم بهتری از چندین رشته CPU، آگاهی بهتر از پشتیبانی رنگ در ترمینال‌های مدرن و گزینه‌های مرتب‌سازی بیشتر را در کنار سایر ویژگی‌ها فراهم می‌کند. برخلاف top، این دستور همیشه به طور پیش‌فرض نصب نمی‌شود، اما می‌تواند به عنوان جایگزینی برای آن در نظر گرفته شود. می‌توانید با فشار دادن Ctrl+C مانند top از htop خارج شوید. همچنین می‌توانید در مورد نحوه استفاده از top و htop بیشتر بیاموزید.

در بخش بعدی، در مورد نحوه استفاده از ابزارها برای پرس‌وجو از فرآیندهای خاص یاد خواهید گرفت.

مرحله 2 – نحوه استفاده از ps برای فهرست کردن فرآیندها

top و htop یک رابط داشبورد برای مشاهده فرآیندهای در حال اجرا مشابه یک مدیر وظیفه گرافیکی ارائه می‌دهند. یک رابط داشبورد می‌تواند یک مرور کلی ارائه دهد، اما معمولاً خروجی قابل اجرا را مستقیماً برنمی‌گرداند. برای این منظور، لینوکس دستور استاندارد دیگری به نام ps را برای پرس‌وجو از فرآیندهای در حال اجرا ارائه می‌دهد.

اجرای ps بدون هیچ آرگومانی اطلاعات بسیار کمی ارائه می‌دهد:

ps
Output
  PID TTY          TIME CMD
 1017 pts/0    00:00:00 bash
 1262 pts/0    00:00:00 ps

این خروجی تمام فرآیندهای مرتبط با کاربر فعلی و جلسه ترمینال را نشان می‌دهد. این در صورتی منطقی است که شما در حال حاضر فقط پوسته bash و این دستور ps را در این ترمینال اجرا می‌کنید.

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

ps aux
Output
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24188  2120 ?        Ss   14:28   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    14:28   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    14:28   0:00 [ksoftirqd/0]
root         6  0.0  0.0      0     0 ?        S    14:28   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    14:28   0:00 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S<   14:28   0:00 [cpuset]
root         9  0.0  0.0      0     0 ?        S<   14:28   0:00 [khelper]

این گزینه‌ها به ps می‌گویند که فرآیندهای متعلق به همه کاربران (صرف نظر از ارتباط ترمینال آنها) را با فرمتی قابل خواندن‌تر برای انسان نشان دهد.

با استفاده از pipeها، می‌توانید با استفاده از grep در خروجی ps aux جستجو کنید تا نام یک فرآیند خاص را برگردانید. این در صورتی مفید است که فکر می‌کنید از کار افتاده است، یا اگر به هر دلیلی نیاز به متوقف کردن آن دارید.

ps aux | grep bash
Output
sammy         41664   0.7  0.0 34162880   2528 s000  S     1:35pm   0:00.04 -bash
sammy         41748   0.0  0.0 34122844    828 s000  S+    1:35pm   0:00.00 grep bash

این دستور هم فرآیند grep که اجرا کرده‌اید و هم پوسته bash که در حال حاضر در حال اجرا است را برمی‌گرداند. همچنین کل حافظه و میزان استفاده از CPU، مدت زمان اجرای آنها و در خروجی هایلایت شده بالا، شناسه فرآیند آنها را نیز برمی‌گرداند. در سیستم‌های لینوکس و یونیکس مانند، به هر فرآیند یک شناسه فرآیند یا PID اختصاص داده می‌شود. سیستم عامل اینگونه فرآیندها را شناسایی و پیگیری می‌کند.

یک راه سریع برای بدست آوردن PID یک فرآیند، استفاده از دستور pgrep است:

pgrep bash
Output
1017

اولین فرآیندی که هنگام بوت شدن سیستم ایجاد می‌شود، init نام دارد و PID آن «1» است.

pgrep init
Output
1

این فرآیند سپس مسئول ایجاد هر فرآیند دیگر روی سیستم است. به فرآیندهای بعدی شماره PID بزرگتری داده می‌شود.

والد یک فرآیند، فرآیندی است که مسئول ایجاد آن بوده است. فرآیندهای والد دارای یک PPID هستند که می‌توانید آن را در سرستون‌های بسیاری از برنامه‌های مدیریت فرآیند، از جمله top، htop و ps، مشاهده کنید.

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

مرحله 3 – نحوه ارسال سیگنال‌های فرآیندها در لینوکس
همه فرآیندها در لینوکس به سیگنال‌ها پاسخ می‌دهند. سیگنال‌ها روشی در سطح سیستم عامل برای گفتن برنامه‌ها به خاتمه یا تغییر رفتارشان هستند.

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

kill PID_of_target_process

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

اگر برنامه بدرفتاری می‌کند و با دریافت سیگنال TERM خارج نمی‌شود، می‌توانید با ارسال سیگنال KILL، سیگنال را تشدید کنید:

kill -KILL PID_of_target_process

این یک سیگنال ویژه است که به برنامه ارسال نمی‌شود.

در عوض، به هسته سیستم عامل داده می‌شود که فرآیند را خاموش می‌کند. این برای دور زدن برنامه‌هایی که سیگنال‌های ارسالی به آنها را نادیده می‌گیرند، استفاده می‌شود.

هر سیگنال یک شماره مرتبط دارد که می‌تواند به جای نام ارسال شود. به عنوان مثال، می‌توانید به جای “-TERM” عدد “-15” و به جای “-KILL” عدد “-9” را ارسال کنید.

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

به عنوان مثال، بسیاری از فرآیندهایی که برای اجرای مداوم در پس‌زمینه طراحی شده‌اند (که گاهی اوقات “daemon” نامیده می‌شوند) هنگامی که به آنها HUP یا سیگنال قطع داده می‌شود، به طور خودکار مجدداً راه‌اندازی می‌شوند. وب سرور آپاچی معمولاً به این روش عمل می‌کند.

sudo kill -HUP pid_of_apache

دستور بالا باعث می‌شود آپاچی فایل پیکربندی خود را مجدداً بارگذاری کند و ارائه محتوا را از سر بگیرد.

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

شما می‌توانید تمام سیگنال‌هایی را که می‌توان با kill ارسال کرد با استفاده از آپشن -l فهرست کنید:

kill -l
Output
1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM

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

دستور pkill تقریباً دقیقاً مانند kill عمل می‌کند، اما به جای آن، روی نام فرآیند عمل می‌کند:

pkill -9 ping

دستور بالا معادل دستور زیر است:

kill -9 `pgrep ping`

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

killall firefox

دستور بالا سیگنال TERM را به هر نمونه از فایرفاکس که روی رایانه اجرا می‌شود، ارسال می‌کند.

مرحله ۴ – نحوه تنظیم اولویت‌های فرآیند

اغلب، شما می‌خواهید تنظیم کنید که کدام فرآیندها در محیط سرور اولویت دارند.
برخی از فرآیندها ممکن است برای موقعیت شما حیاتی تلقی شوند، در حالی که برخی دیگر ممکن است هر زمان که منابع باقی مانده باشد، اجرا شوند.
لینوکس اولویت را از طریق مقداری به نام niceness کنترل می‌کند.
وظایف با اولویت بالا، کمتر nice در نظر گرفته می‌شوند، زیرا آنها نیز منابع را به اشتراک نمی‌گذارند. از سوی دیگر، فرآیندهای با اولویت پایین nice هستند زیرا اصرار دارند که فقط حداقل منابع را مصرف کنند.
وقتی در ابتدای مقاله به بالای صفحه مراجعه کردید، ستونی با علامت “NI” وجود داشت. این مقدار nice فرآیند است:

top
[secondary_label Output] 
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers
Swap:        0k total,        0k used,        0k free,   264812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0

مقادیر Nice بسته به سیستم می‌توانند بین -19/-20 (بالاترین اولویت) و 19/20 (پایین‌ترین اولویت) باشند.
برای اجرای یک برنامه با مقدار nice مشخص، می‌توانید از دستور nice استفاده کنید:

nice -n 15 command_to_execute

این فقط هنگام شروع یک برنامه جدید کار می‌کند.
برای تغییر مقدار nice برنامه‌ای که در حال اجرا است، از ابزاری به نام renice استفاده می‌کنید:

renice 0 PID_to_prioritize

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

مهدی منصوری

من مهدی منصوری و کارشناس حوزه نرم افزار و امنیت اطلاعات هستم. کارشناسی ارشد خودم را در رشته امنیت اطلاعات از دانشگاه مالک اشتر تهران گرفتم. هم اکنون در زمینه DevOPS مشغول هستم. و در زمان های ممکن در این سایت و چند سایت دیگه مطلب می گذارم

درباره نویسنده

مهدی منصوری

من مهدی منصوری و کارشناس حوزه نرم افزار و امنیت اطلاعات هستم. کارشناسی ارشد خودم را در رشته امنیت اطلاعات از دانشگاه مالک اشتر تهران گرفتم.
هم اکنون در زمینه DevOPS مشغول هستم. و در زمان های ممکن در این سایت و چند سایت دیگه مطلب می گذارم

افزودن نظر

برای ارسال نظرات خود اینجا را کلیک کنید