مقدمه
یک سرور لینوکس، مانند هر کامپیوتر مدرنی، چندین برنامه را اجرا میکند. این برنامهها به عنوان فرآیندهای جداگانه نامیده و مدیریت میشوند.
در حالی که لینوکس مدیریت سطح پایین و پشت صحنه را در چرخه حیات یک فرآیند – یعنی راهاندازی، خاموش کردن، تخصیص حافظه و غیره – انجام میدهد، شما به روشی برای تعامل با سیستم عامل نیاز خواهید داشت تا آنها را از سطح بالاتری مدیریت کنید.
در این راهنما، برخی از جنبههای اساسی مدیریت فرآیند را خواهید آموخت. لینوکس تعدادی ابزار استاندارد و داخلی را برای این منظور ارائه میدهد.
شما این ایدهها را در محیط اوبونتو 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
نتیجهگیری
مدیریت فرآیندها بخش اساسی لینوکس است که تقریباً در هر زمینهای مفید است. حتی اگر شما هیچ مدیریت سیستم عملی انجام نمیدهید، توانایی ردیابی فرآیندهای گیر کرده و مدیریت دقیق آنها بسیار مفید است.
افزودن نظر