
یک برنامه، از مجموعهی کدها و متغیرها، تشکیل شده است. وقتی شما یک برنامه را اجرا میکنید، سیستم عامل، فضایی را در حافظهی اصلی و همچنین بخشی از زمان پردازنده را، به آن اختصاص میدهد. فرآیند یا پروسس(process)، در حقیقت، به یک نمونه از برنامهی درحال اجرا میگویند. کار مدیریت فرآیندها در لینوکس ، بر عهدهی سیستم عامل میباشد. هر دستور و یا هر برنامهای، که اجرا میشود، سیستم عامل به آن یک کد یا شناسه (PID) و یا Process ID اختصاص میدهد. این شناسه تا آخر اجرای برنامه، فقط به آن فرآیند، اختصاص خواهد داشت. پس از اتمام کار برنامه این شناسه را میتوان برای فرآیند دیگر، استفاده نمود. برای آشنایی بیشتر، با مدیریت فرآیندها در لینوکس، با ما همراه باشید.
دستور ps جهت اطلاع از لیست فرآیندها
1 2 3 4 5 6 7 |
kazemian@upgradeit:~$ ps PID TTY TIME CMD 9711 pts/1 00:00:00 bash 9720 pts/1 00:00:00 ps kazemmian@upgradeit:~$ |
با استفاده از دستور ps میتوانیم لیست فرآیندها را در سیستم عامل بدست آوریم. سادهترین حالت، خود دستور ps میباشد. دستور ps لیست فرآیندهای ترمینال جاری، مشاهده میگردد. با آپشن f- میتوانیم مشخصات کامل فرآیندها مشاهده نماییم:
1 2 3 4 5 6 7 |
kazemian@upgradeit:~$ ps -f UID PID PPID C STIME TTY TIME CMD kazemian 9711 8818 0 11:52 pts/1 00:00:00 bash kazemian 11207 9711 0 14:28 pts/1 00:00:00 ps -f kazemian@upgradeit:~$ |
آپشن x- فرایندهای خارج از ترمینال را نیز نمایش میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
kazemian@upgradeit:~$ ps -x PID TTY STAT TIME COMMAND 1012 ? Ss 0:00 /lib/systemd/systemd --user 1024 ? S 0:00 (sd-pam) 1030 ? S<sl 0:00 /usr/bin/pulseaudio --daemonize=no --log-target=jou 1032 ? SNsl 0:00 /usr/libexec/tracker-miner-fs 1035 ? Sl 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login 1039 tty2 Ssl+ 0:00 /usr/lib/gdm3/gdm-x-session --run-script env GNOME_ 1041 tty2 Sl+ 0:00 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user 1044 ? Ss 0:00 /usr/bin/dbus-daemon --session --address=systemd: - 1052 ? Ssl 0:00 /usr/libexec/gvfsd 1067 ? Sl 0:00 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o b 1075 ? Ssl 0:00 /usr/libexec/gvfs-udisks2-volume-monitor 1081 ? Ssl 0:00 /usr/libexec/gvfs-goa-volume-monitor 1085 ? Sl 0:00 /usr/libexec/goa-daemon 1100 ? Sl 0:00 /usr/libexec/goa-identity-service 1108 ? Ssl 0:00 /usr/libexec/gvfs-mtp-volume-monitor 1113 ? Ssl 0:00 /usr/libexec/gvfs-afc-volume-monitor 1118 ? Ssl 0:00 /usr/libexec/gvfs-gphoto2-volume-monitor 1128 tty2 Sl+ 0:00 /usr/libexec/gnome-session-binary --systemd --syste 1181 ? Ssl 0:00 /usr/libexec/tracker-store 1219 ? S 0:00 /usr/bin/VBoxClient --clipboard 1221 ? Sl 0:00 /usr/bin/VBoxClient --clipboard 1224 ? S 0:00 /usr/bin/VBoxClient --checkhostversion 1225 ? S 0:00 /usr/bin/VBoxClient --checkhostversion 1229 ? S 0:00 /usr/bin/VBoxClient --seamless 1231 ? Sl 0:00 /usr/bin/VBoxClient --seamless 1237 ? S 0:00 /usr/bin/VBoxClient --draganddrop 1238 ? Sl 0:00 /usr/bin/VBoxClient --draganddrop 1245 ? S 0:00 /usr/bin/VBoxClient --vmsvga 1246 ? Sl 0:00 /usr/bin/VBoxClient --vmsvga 1254 ? Ss 0:00 /usr/bin/ssh-agent /usr/bin/im-launch env GNOME_SHE 1271 ? Ssl 0:00 /usr/bin/ibus-daemon --daemonize --xim 1275 ? Sl 0:00 /usr/libexec/ibus-dconf 1276 ? Sl 0:00 /usr/libexec/ibus-ui-gtk3 1278 ? Sl 0:01 /usr/libexec/ibus-extension-gtk3 1282 ? Sl 0:00 /usr/libexec/ibus-x11 --kill-daemon 1285 ? Sl 0:00 /usr/libexec/ibus-portal 1299 ? Ssl 0:00 /usr/libexec/at-spi-bus-launcher 1304 ? S 0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defau 1319 ? Ssl 0:00 /usr/libexec/xdg-desktop-portal 1326 ? Sl 0:00 /usr/libexec/at-spi2-registryd --use-gnome-session 1331 ? Ssl 0:00 /usr/libexec/xdg-document-portal 1337 ? Ssl 0:00 /usr/libexec/xdg-permission-store 1346 ? Ssl 0:00 /usr/libexec/xdg-desktop-portal-gtk 1359 ? Sl 0:00 /usr/libexec/dconf-service 1366 ? Ssl 0:00 /usr/libexec/gnome-session-ctl --monitor 1373 ? Ssl 0:00 /usr/libexec/gnome-session-binary --systemd-service 1389 ? Ssl 0:05 /usr/bin/gnome-shell 1400 ? Sl 0:00 /usr/libexec/ibus-engine-simple 1428 ? Sl 0:00 /usr/libexec/gnome-shell-calendar-server 1434 ? Ssl 0:00 /usr/libexec/evolution-source-registry 1446 ? Ssl 0:00 /usr/libexec/evolution-calendar-factory 1460 ? Ssl 0:00 /usr/libexec/evolution-addressbook-factory 1481 ? Sl 0:00 /usr/bin/gjs /usr/share/gnome-shell/org.gnome.Shell 1489 ? Sl 0:00 /usr/libexec/gvfsd-trash --spawner :1.4 /org/gtk/gv 1502 ? Ssl 0:00 /usr/libexec/gsd-a11y-settings 1507 ? Ssl 0:00 /usr/libexec/gsd-color 1509 ? Ssl 0:00 /usr/libexec/gsd-datetime 1512 ? Ssl 0:00 /usr/libexec/gsd-housekeeping 1513 ? Ssl 0:00 /usr/libexec/gsd-keyboard 1517 ? Ssl 0:00 /usr/libexec/gsd-media-keys 1519 ? Ssl 0:00 /usr/libexec/gsd-power 1520 ? Sl 0:00 /usr/libexec/evolution-data-server/evolution-alarm- 1521 ? Ssl 0:00 /usr/libexec/gsd-print-notifications 1523 ? Ssl 0:00 /usr/libexec/gsd-rfkill 1526 ? Sl 0:00 /usr/libexec/gsd-disk-utility-notify 1530 ? Ssl 0:00 /usr/libexec/gsd-screensaver-proxy 1535 ? Ssl 0:00 /usr/libexec/gsd-sharing 1536 ? Ssl 0:00 /usr/libexec/gsd-smartcard 1537 ? Ssl 0:00 /usr/libexec/gsd-sound 1538 ? Ssl 0:00 /usr/libexec/gsd-usb-protection 1542 ? Ssl 0:00 /usr/libexec/gsd-wacom 1549 ? Ssl 0:00 /usr/libexec/gsd-wwan 1554 ? Ssl 0:00 /usr/libexec/gsd-xsettings 1639 ? Sl 0:00 /usr/libexec/gsd-printer 1713 ? Ssl 0:00 /usr/libexec/gnome-terminal-server 1723 pts/0 Ss 0:00 bash 1750 pts/0 R+ 0:00 ps -x kazemian@upgradeit:~$ |
وضعیتهای یک فرآیند
وضعیت Running
فرآیند در حال اجرا، و یا آماده برای دریافت زمان از پردازنده برای اجرا
وضعیت Waiting
در این حالت فرآیند منتظر، یک اتفاق، مثلا فشرده شدن یک کلید است.
وضعیت Stopped
در این وضعیت، روند اجرای فرآیند، متوقف شده است. مثلا برای حالت debuging.
در مثال زیر دستور sleep به مدت 100 ثانیه، اجرا شده است. با فشردن کلید Ctrl_Z روند اجرای برنامه را متوقف میسازیم. با دستور jobs میتوانیم، برنامههای در حال اجرا و متوقف شده را ببینیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
kazemian@upgradeit:~$ sleep 150 ^Z [1]+ Stopped sleep 150 kazemian@upgradeit:~$ jobs [1]+ Stopped sleep 150 kazemian@upgradeit:~$ sleep 200& [2] 24017 kazemian@upgradeit:~$ jobs [1]+ Stopped sleep 150 [2]- Running sleep 200 & kazemian@upgradeit:~$ |
برای اینکه، یک فرآیند از حالت توقف خارج شود، از دستور fg استفاده میکنیم.
1 2 3 4 5 6 7 8 |
kazemian@upgradeit:~$ sleep 200& [1] 24982 kazemian@upgradeit:~$ jobs [1]+ Running sleep 200 & kazemian@upgradeit:~$ fg 1 sleep 200 |
وضعیت Zombie
در این وضعیت، اجرای فرآیند خاتمه یافته، اما هنوز فرآیند در جدول فرآیندها موجود است.
انواع فرآیندهای لینوکس
وقتی شما برنامهای را اجرا مینمایید، این برنامه توسط سیستم عامل به دو صورت، می تواند اجرا گردد: فرایندهای Foreground و فرآیندهای Background.
فرآیندهای Foreground
وقتی که از یک ترمینال در لینوکس، فرمانی را اجرا میکنید، به طور پیشفرض این برنامه موقع اجرا در صورتی که نیاز به ورودی خاصی داشته باشد، منتظر ورود اطلاعات توسط کاربر شده و سپس نتیجه را در خروجی نمایش داده و سپس به حالت پرامپت یا علامت اعلان بازمیگردد. به این نوع فرآیندها، فرآیندهای Foreground میگویند.
نکتهی قابل ذکر این است که فرآیندهای Foreground تا موقعی که در حال اجرا میباشند، شما قادر به اجرای فرمان دیگری در آن ترمینال نخواهید بود. وقتی که مراحل فرآیند به اتمام رسید و اعلان سیستم به نمایش در آمد، شما میتوانید فرمانهای بعدی را اجرا نمایید.به عنوان مثال، با وارد نمودن دستور ls سیستم عامل این برنامه را در حافظه قرار داده و با اختصاص دادن یک شمارهی فرآیند اختصاصی به آن، فرایند شروع به کار نموده و نتیجه در خروجی نمایش داده میشود. پس از اتمام کار فرآیند، مجدد منابع اختصاصی فرآیند آزاد شده و حالت اعلان، نمایش داده میشود.
فرآیندهای Background
فرآیندهایی که به صورت Background اجرا میشوند، دیگر ترمینال را در انتظار اجرا قرار نمیدهند. شما میتوانید با اجرای برنامهای که در حالت Background اجرا میشود، فرمانهای دیگر را نیز، اجرا نمایید. برای اینکه بتوانیم فرآیندی را در حالت Background اجرانماییم، باید برای اجرای دستور یا برنامهی مربوطه یک & را با آخر فرمان اضافه نماییم.
1 2 3 4 5 |
kazemian@upgradeit:~$ cp test1 test2 & [1] 8893 kazemian@upgradeit:~$ |
پس از اجرای فرآیند در حالت Background بلافاصله پس از نمایش شماره فرآیند یا PID، اعلان یا کرسر نمایش داده میشود. اجرای برنامهها و دستورات برای حالتهایی مثل Backup گرفتن و دیگر حالتهایی که اجرای یک فرآیند، زمانبر است، مناسب میباشد.
دیمونها(Daemons)
دیمونها فرآیندهایی هستند که معمولا با سطح دسترسی کاربر root اجرا میگردند. دیمونها معمولا سرویسی را به فرآیندهای دیگر ارائه می دهند. دیمونها به صورت Background اجرا میشوند و معمولا منتظر اتفاق خاصی میمانند تا به آن واکنش نشان دهند. مثلا یک دیمون وب سرور منتظر درخواست ارتباط از طریق پروتکل http میماند. به محض دریافت درخواست از طرف کلاینت سرویس لازم را به آن ارائه میدهد. دیمونها معمولا با بوت شدن سیستم عامل، اجرا شده و تا آخر، باقی میمانند.
فرآیندهای والد و فرزند
در مدیریت فرآیندها در سیستم عامل لینوکس، هر فرآیند توسط فرآیند والد خود ایجاد شده است. هر فرآیند دارای دو شناسهی فرآیند میباشد. اولین شناسهی فرآیند یا PID مربوط به خود فرآیند است و دومین شناسه، مربوط به شناسهی فرآیند والد، یا PPID میباشد. والد تمام فرآیندها، در بیشتر توزیعهای لینوکس فرآیند systemd میباشد، که بهجای فرآیند init استفاده میشود.
دستورات پراستفاده در فرآیندها
دستور top
دستور top، گزارشی از وضعیت فرآیندها و همچنین، میزان اختصاص حافظه و پردازنده، ارائه میدهد. این دستور، ابزار مفیدی، برای مانیتورینگ وضعیت فرآیندها، در سرورهای شبکه میباشد. با کمک این ابزار، میتوانیم، وضعیت کلی مصرف منابع سیستم، از قبیل حافظه و پردازنده را مشاهده نماییم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
kazemian@upgradeit:~$ top top - 15:34:21 up 6 min, 1 user, load average: 0.07, 0.33, 0.21 Tasks: 187 total, 1 running, 186 sleeping, 0 stopped, 0 zombie %Cpu(s): 14.7 us, 5.9 sy, 0.0 ni, 79.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 3935.7 total, 2176.1 free, 634.6 used, 1125.0 buff/cache MiB Swap: 923.3 total, 923.3 free, 0.0 used. 3054.1 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1120 kazemian 20 0 4183968 338216 112216 S 25.0 8.4 0:50.93 gnome-s+ 2770 kazemian 20 0 26088 3760 3260 R 12.5 0.1 0:00.02 top 1 root 20 0 169616 14032 8556 S 0.0 0.3 0:03.51 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+ 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+ 8 root 20 0 0 0 0 I 0.0 0.0 0:00.34 kworker+ 9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_perc+ 10 root 20 0 0 0 0 S 0.0 0.0 0:00.06 ksoftir+ 11 root 20 0 0 0 0 I 0.0 0.0 0:00.38 rcu_sch+ 12 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migrati+ 13 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_in+ 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 16 root -51 0 0 0 0 S 0.0 0.0 0:00.00 idle_in+ 17 root rt 0 0 0 0 S 0.0 0.0 0:00.29 migrati+ |
دستور kill
با دستور kill، میتوانید، به اجرای یک فرآیند، خاتمه دهید. برای این کار دستور kill PID را اجرا نمایید. برای بهدست آوردن شمارهی فرآیند(PID)، از دستور pidof process name استفاده نمایید.
دستور nice
در لینوکس، برنامههای زیادی، میتوانند به صورت همزمان، اجرا شوند. در صورتی که بخواهیم، برای بعضی از فرآیندها، اولویت بیشتری، در استفاده از منابع سیستم، قائل شویم، از دستور nice -n ‘Nice Value’ process name برای اجرای آن فرآیند، استفاده میکنیم. دستور nice برای شروع اجرای هر فرآیند اولویت 19- تا 20 را میتواند قرار دهد. بیشترین اولویت 19- و کمترین اولویت 20 می باشد. پیشفرض اولویت(priority) برای تمام فرایندها، 0 میباشد.
در صورتی که یک فرآیند در حال اجرا باشد، برای تغییر مقدار اولویت آن، از دستور renice ‘Nice Value’ -p PID استفاده می نماییم.
دستور df
با دستور df میتوانیم، وضعیت حافظهی مصرف شده و همچنین قابل استفادهی هارددیسکها را مشاهده نماییم.
1 2 3 4 5 6 |
kazemian@upgradeit:~$ df | grep sda /dev/sda5 19992176 8987524 9966060 48% / /dev/sda1 523248 4 523244 1% /boot/efi kazemian@upgradeit:~$ |
دستور free
با این دستور می توانیم، میزان مصرف و میزان حافظهی قابل استفاده در حافظهی اصلی(RAM)، را مشاهده نماییم.
1 2 3 4 5 6 7 |
kazemian@upgradeit:~$ free total used free shared buff/cache available Mem: 4030204 654648 1550964 13736 1824592 3076684 Swap: 945416 0 945416 kazemian@upgradeit:~$ |