ps - برای نمایش فرایندهای فعال در خروجی استاندارد استفاده میشود.
شکل کلی دستور:
$ ps [options]
همینطور که اطلاع دارید گنو/لینوکس یک سیستمعامل چندوظیفهای است به این معنی که میتواند بیش از یک پردازش را انجام دهد و در واحد زمان چندین فرایند در حال اجرا باشد. این دستور که مخفف process status میباشد و در خروجی آن فرایندهای فعال را خواهیم دید. تفاوت با دستور top این است که دستور top خروجی لحظهای را به شما میدهد ولی دستور ps این طور نیست. وقتی از دستور ps و بدون گزینهی اختیاری استفاده میکنیم، فرایندهایی را نشان میدهد که شما با آن در حال کار هستید. در مثال زیر خروجی از این دستور را میبینید:
مثال:
$ ps PID TTY TIME CMD 9839 pts/0 00:00:00 bash 9894 pts/0 00:00:00 ps
در گنو/لینوکس دستورات کاملی برای مدیریت فرایندهاست مانند: kill، nice، renice و...
در این خروجی ما چهار ستون را مشاهده میکنیم ولی در ادامه با گزینههای اختیاری که توضیح میدهیم این ستون ها بیشتر میشود که به صورت مختصر در ادامه توضیح داده شدهاند:
- CPU% - نشان میدهد که فرایند چه مقدار از واحدکنترل پردازش را مورد استفاده قرار داده است.
- MEM% - نشان میدهد که فرایند چه مقدار از فضای حافظه را مورد استفاده قرار داده است.
- ADDR - آدرس حافظه از فرایند را نشان میدهد.
- CMD - دستوری که باعث فراخوانی فرایند شده است.
- PID - شماره شناسهی فرایند
- PPID - نشان دهنده شماره شناسهی والد فرایند
- NI - مقدار اولویت (به دستور nice مراجعه کنید.)
- C - استفاده از واحدکنترلپردازش و اطلاعات زمانبندی را نشان میدهد.
- SZ - استفاده از حافظهی مجازی را نشان میدهد.
- TIME - میزان زمان واحدکنترلپردازش حفظ شده توسط فرایند
- UID - شماره شناسه کاربر مالک فرایند
- PRI - اولویت فرایند
- S یا STATE - که وضعیت فرایند را نشان میدهد.
- START یا STIME- زمانی که فرایند شروع به کار کرده است.
- RSS - میزان واقعی مصرفی حافظه
- TT یا TTY - شماره دستوری که فرایند از آنجا آغاز میشود.
برای مثال در خروجی زیر، بعضی از ستونهای بالا مشاهده میکنید:
$ ps -ef | more UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:26 ? 00:00:00 /sbin/init root 2 0 0 18:26 ? 00:00:00 [kthreadd] root 3 2 0 18:26 ? 00:00:00 [ksoftirqd/0] root 4 2 0 18:26 ? 00:00:02 [kworker/0:0] root 5 2 0 18:26 ? 00:00:00 [kworker/u:0] root 6 2 0 18:26 ? 00:00:00 [migration/0] root 7 2 0 18:26 ? 00:00:00 [watchdog/0] root 8 2 0 18:26 ? 00:00:00 [migration/1] root 10 2 0 18:26 ? 00:00:00 [ksoftirqd/1] root 12 2 0 18:26 ? 00:00:00 [watchdog/1] root 13 2 0 18:26 ? 00:00:00 [cpuset] root 14 2 0 18:26 ? 00:00:00 [khelper] root 15 2 0 18:26 ? 00:00:00 [kdevtmpfs] root 16 2 0 18:26 ? 00:00:00 [netns] root 17 2 0 18:26 ? 00:00:00 [kworker/u:1] root 18 2 0 18:26 ? 00:00:00 [sync_supers] root 19 2 0 18:26 ? 00:00:00 [bdi-default] root 20 2 0 18:26 ? 00:00:00 [kintegrityd] root 21 2 0 18:26 ? 00:00:00 [kblockd] root 22 2 0 18:26 ? 00:00:00 [ata_sff] root 23 2 0 18:26 ? 00:00:00 [khubd] root 24 2 0 18:26 ? 00:00:00 [md] --More--
در برخی موارد، شما ممکن است بخواهید فهرست فرایندها را محدود کنید مثل تمام فرآیندهای متعلق به یک کاربر داده شده، یا همه رخدادهای یک برنامه خاص و... که در این صورت میتوانید از grep استفاده کنید. به دو مثال زیر خوب توجه کنید:
$ ps -ef | grep firefox 1000 2889 1 13 19:18 ? 00:06:20 /usr/lib/firefox/firefox 1000 3493 3408 0 20:04 pts/0 00:00:00 grep --color=auto firefox
$ ps -ef | grep cpuset root 13 2 0 18:26 ? 00:00:00 [cpuset] 1000 3621 3563 0 20:06 pts/2 00:00:00 grep --color=auto cpuset
من در مثال اول به دنبال اطلاعاتی در مورد مرورگرفایرفاکس هستم. در مثال دوم من به دنبال اطلاعاتی در مورد cpuset هستم.
شباهت هر دو دستور در چیست؟ به نظر شما خط دوم در هر مثال اضافه نیست؟!
بله! در ابتدا گفته شد که در خروجی «فرایندهای فعال» را خواهیم دید. در خط اولی هرکدام از مثالهای بالا ما از grep بهره گرفتیم و فرایند مربوط به grep فعال شد. از آنجایی که دستور grep خروجی را با توجه به الگو (به طور کلی یک الگو میتواند هرچیزی حتی یک کاراکتر یا یک کلمه یا یک جمله باشد. در بخشهای بعدی منظور از الگو کامل توضیح داده خواهد شد) خلاصه سازی میکند، پس این دستور الگوی درخواستی را در خروجی استاندارد نشان میدهد. در مثال بعدی الگوی دیگری را آوردهایم تا مفهوم رسانده شود:
~$ ps -ef | grep "20":"[0-9][0-9]" 1000 3499 3400 0 20:04 pts/1 00:00:00 bash 1000 3563 3400 0 20:05 pts/2 00:00:00 bash root 3623 2 0 20:12 ? 00:00:00 [kworker/0:1] root 3624 2 0 20:12 ? 00:00:00 [kworker/1:0] root 3630 2 0 20:18 ? 00:00:00 [kworker/0:2] root 3631 2 0 20:18 ? 00:00:00 [kworker/1:2] 1000 3710 3563 0 20:20 pts/2 00:00:00 ps -ef 1000 3711 3563 0 20:20 pts/2 00:00:00 grep --color=auto 20:[0-9][0-9]
در مثال بالا، من به دنبال آندسته از فرایندهایی هستم که از ساعت ۲۰ تا ۲۰:۵۹ آغاز به کار کردهاند.
گزینههای اختیاری:
e-
: تمام فرایندهای درحال اجرا بر روی سیستم فعلی را نشان میدهد و نه فقط فرایندهایی که با پوستهی فعلی در ارتباط است. از آنجایی که خروجی این دستور بسیار طولانی است از more و یا less استفاده کنید.
$ ps -e | more PID TTY TIME CMD 1 ? 00:00:00 init 2 ? 00:00:00 kthreadd 3 ? 00:00:00 ksoftirqd/0 4 ? 00:00:02 kworker/0:0 5 ? 00:00:00 kworker/u:0 6 ? 00:00:00 migration/0 7 ? 00:00:00 watchdog/0 8 ? 00:00:00 migration/1 10 ? 00:00:00 ksoftirqd/1 12 ? 00:00:00 watchdog/1 13 ? 00:00:00 cpuset 14 ? 00:00:00 khelper 15 ? 00:00:00 kdevtmpfs 16 ? 00:00:00 netns 17 ? 00:00:00 kworker/u:1 18 ? 00:00:00 sync_supers 19 ? 00:00:00 bdi-default 20 ? 00:00:00 kintegrityd 21 ? 00:00:00 kblockd 22 ? 00:00:00 ata_sff 23 ? 00:00:00 khubd 24 ? 00:00:00 md --More--
f-
: نمایشی از اطلاعات کامل در مورد هر فرایند را نشان میدهد و معمولاً با گزینهی اختیاری e-
استفاده میشود.
$ ps -ef|more UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:26 ? 00:00:00 /sbin/init root 2 0 0 18:26 ? 00:00:00 [kthreadd] root 7 2 0 18:26 ? 00:00:00 [watchdog/0] root 8 2 0 18:26 ? 00:00:00 [migration/1] root 10 2 0 18:26 ? 00:00:00 [ksoftirqd/1] root 22 2 0 18:26 ? 00:00:00 [ata_sff] root 23 2 0 18:26 ? 00:00:00 [khubd] root 24 2 0 18:26 ? 00:00:00 [md] --More--
l-
: اطلاعات کاملتری و لیست طولانیتری مشاهده خواهید کرد که در ابتدا در مورد آنها بحث شد:
$ ps -efl | more F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S root 1 0 0 80 0 - 881 poll_s 18:26 ? 00:00:00 /sbin/init 1 S root 10 2 0 80 0 - 0 run_ks 18:26 ? 00:00:00 [ksoftirqd/1] 5 S root 15 2 0 80 0 - 0 devtmp 18:26 ? 00:00:00 [kdevtmpfs] 1 S root 16 2 0 60 -20 - 0 rescue 18:26 ? 00:00:00 [netns] 1 S root 17 2 0 80 0 - 0 worker 18:26 ? 00:00:00 [kworker/u:1] 1 S root 18 2 0 80 0 - 0 bdi_sy 18:26 ? 00:00:00 [sync_supers] 1 S root 19 2 0 80 0 - 0 bdi_fo 18:26 ? 00:00:00 [bdi-default] 1 S root 20 2 0 60 -20 - 0 rescue 18:26 ? 00:00:00 [kintegrityd] 1 S root 21 2 0 60 -20 - 0 rescue 18:26 ? 00:00:00 [kblockd] 1 S root 255 2 0 80 0 - 0 kjourn 18:26 ? 00:00:00 [jbd2/sda15-8] --More--
A-
: با گزینهی اختیاری e-
که در ابتدا توضیح داده شد برابر است.
u-
: وقتی میخواهید خروجی را با نام یک کاربر محدود کنید و اطلاعاتی در مورد فرایندهای فعال از طرف آن کاربر مطلع بشوید:
$ ps -u root PID TTY TIME CMD 1 ? 00:00:00 init 2 ? 00:00:00 kthreadd 3 ? 00:00:01 ksoftirqd/0 5 ? 00:00:00 kworker/u:0 6 ? 00:00:00 migration/0 7 ? 00:00:00 watchdog/0 8 ? 00:00:00 migration/1 10 ? 00:00:00 ksoftirqd/1 12 ? 00:00:00 watchdog/1 13 ? 00:00:00 cpuset 14 ? 00:00:00 khelper 15 ? 00:00:00 kdevtmpfs 16 ? 00:00:00 netns
نکته: شما میتوانید با استفاده از کاما تعداد کاربران که میخواهید فرایندهای فعال آنان را ببینید افزایش دهید:
$ ps -ef -u user1,user2,user3,user4
C-
: گفتیم که در خروجی ستونی به نام CMD که در ابتدا گفته شد «دستوری که باعث فراخوانی فرایند شده است» داریم. با استفاده از این گزینهی اختیاری میتوان با توجه به ستون CMD فرایند را نسبت به یک دستور محدود کنیم:
$ ps -C getty | more PID TTY TIME CMD 900 tty4 00:00:00 getty 910 tty5 00:00:00 getty 928 tty2 00:00:00 getty 930 tty3 00:00:00 getty 932 tty6 00:00:00 getty 1200 tty1 00:00:00 getty
ناگفته نماند که این یکی از برتریهای این دستور است که نیازی با استفاده از grep و... ندارد و گزینهی اختیاری مخصوص به خود را داراست.
نکته: در این گزینهی اختیاری نیازی به استفاده از گزینههای اختیاری A-
و e-
نیست. مگر چه میشود؟
$ ps -eC getty | more PID TTY TIME CMD 1 ? 00:00:00 init 2 ? 00:00:00 kthreadd 3 ? 00:00:01 ksoftirqd/0 5 ? 00:00:00 kworker/u:0 6 ? 00:00:00 migration/0 7 ? 00:00:00 watchdog/0 8 ? 00:00:00 migration/1 10 ? 00:00:00 ksoftirqd/1 12 ? 00:00:00 watchdog/1 13 ? 00:00:00 cpuset 14 ? 00:00:00 khelper 15 ? 00:00:00 kdevtmpfs 16 ? 00:00:00 netns 17 ? 00:00:00 kworker/u:1 18 ? 00:00:00 sync_supers 19 ? 00:00:00 bdi-default 20 ? 00:00:00 kintegrityd 21 ? 00:00:00 kblockd 22 ? 00:00:00 ata_sff 23 ? 00:00:00 khubd 24 ? 00:00:00 md 26 ? 00:00:00 khungtaskd
خروجی مطابق میل ما نخواهد بود.
p-
: گفتیم که هر فرایند شماره منحصر به فرد خودش را دارد که با آن شناخته میشود. اگر به دنبال فرایند خاصی هستید که شماره شناسهی منحصربه فرد آن را دارید میتوانید از این گزینهی اختیاری استفاده کنید:
$ ps -f -p 1 UID PID PPID C STIME TTY TIME CMD root 1 0 0 18:26 ? 00:00:00 /sbin/init
در مثال بالا من به دنبال فرایند مادر هستم که فرایند مادر همیشه شماره 1 را به خودش اختصاص میدهد. اگر به ستون PPID نگاه کنید متوجه میشوید که شماره شناسهی منحصر به فرد والد آن ۰ است، به این معنی که از هیچ والد دیگری بوجود یا مشتق نشده است. اگر شما به دنبال شناسهی منحصر به فرد ۰ باشید با خطا روبهرو خواهید شد:
$ ps -f -p 0 ERROR: Process ID out of range.
اگر به ستون STIME نگاه کنید باید به این نتیجه برسید که سیستم من ساعت ۱۸:۲۶ در دسترس قرار گرفته است و زمان شروع کار من با سیستم بوده است.
ppid-
: هر فرایند ممکن است فرایند یا فرایندهای دیگری را بهوجود بیاورد و باز این امکان دارد آن فرایند یا فرایندهای بهوجود آمده یک یا چند فرایند دیگری را بهوجود بیاورد که بهوجود آمده را فرزند و بهوجود آورنده را والد گویند که والد دارای شماره منحصر به فرد است. اگر به دنبال یک شماره منحصربه فرد والد هستید میتوانید از این گزینهی اختیاری استفاده کنید:
$ ps -f --ppid 343 UID PID PPID C STIME TTY TIME CMD root 457 343 0 18:27 ? 00:00:00 /sbin/udevd --daemon root 458 343 0 18:27 ? 00:00:00 /sbin/udevd --daemon
در مثال بالا من به دنبال والدهایی با شمارهی شناسهی منحصر به فرد ۳۴۳ میباشد که در این صورت میتوان در خروجی استاندارد تعداد فرزندان آن را مشاهده کرد.
دوباره یادآور میشوم که اگر عدد ۱ را وارد کنید تمام فرایندهای فعال را خواهید دید. بیایید یک بار به صورت خلاصه مفهوم والد و فرزند را با استفاده از دستور ps و آرگومان forest--
این را به تصویر بکشیم:
$ ps -ef --forest root 1029 979 3 18:27 tty7 00:08:37 \_ /usr/bin/X :0 -auth /var/run root 1383 979 0 18:27 ? 00:00:00 \_ lightdm --session-child 12 1 1000 1614 1383 0 18:30 ? 00:00:00 \_ gnome-session --session= 1000 1649 1614 0 18:30 ? 00:00:00 \_ /usr/bin/ssh-agent / 1000 1662 1614 0 18:30 ? 00:00:08 \_ /usr/lib/gnome-setti 1000 1680 1614 4 18:30 ? 00:09:21 \_ compiz 1000 1834 1680 0 18:30 ? 00:00:00 | \_ /bin/sh -c /usr/ 1000 1835 1834 0 18:30 ? 00:00:04 | | \_ /usr/bin/gtk 1000 4444 1680 0 21:09 ? 00:00:00 | \_ /bin/sh -c gnome 1000 4445 4444 0 21:09 ? 00:00:06 | \_ gnome-termin 1000 4449 4445 0 21:09 ? 00:00:00 | \_ gnome-pt 1000 4751 4445 0 21:42 pts/1 00:00:00 | \_ bash 1000 4810 4751 0 21:42 pts/1 00:00:00 | | \_ more 1000 4816 4445 0 21:42 pts/2 00:00:00 | \_ bash 1000 4892 4816 0 21:56 pts/2 00:00:00 | | \_ more 1000 5000 4445 0 22:09 pts/0 00:00:00 | \_ bash 1000 5061 5000 0 22:10 pts/0 00:00:00 | \_ ps -
(خروجی خلاصه شده است) که برای مثال gnome-termin والد gnome-pt و bash میباشد.