ps - نمایش فرایندهای فعال

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 می‌باشد.