سرفصل‌های آموزشی
آموزش لینوکس
آشنایی با کامند ps در لینوکس

آشنایی با کامند ps در لینوکس

ps اطلاعاتی در مورد پروسه‌های در حال اجرا در لینوکس در اختیار ما قرار می‌دهد که بر اساس PID سورت شده‌اند اما اگر نیاز داشته باشید تا به صورت Real-time (در لحظه) این لیست از پروسه‌ها آپدیت شود، می‌توانید از کامند از پیش تعریف شده‌ای در لینوکس تحت عنوان top و یا ابزارهای کمی پیشرفته‌تری همچون htop یا atop استفاده کنید.

ps دارای آپشن‌های بسیاری است که این امکان را به کاربر می‌دهند تا مشخص کند چه تسکی را بررسی کند، چه اطلاعاتی را نمایش دهد و حتی نحوهٔ نمایش خروجی داده‌ها نیز به چه شکل باشد اما این در حالی است که اگر از هیچ آپشنی برای این کامند استفاده نکنیم، ps تمامی پروسه‌هایی که در شِل مد نظر اجرا شده‌اند را نمایش خواهد داد:

$ ps
  PID TTY          TIME CMD
13474 pts/1    00:00:00 bash
16635 pts/1    00:00:00 ps

همان‌طور که می‌بینیم، کلیهٔ پروسه‌های در حال اجرا در شِل فعلی نمایش داده شده‌اند. به عبارت دیگر، در ترمینالی که ما این دستور را وارد کردیم صرفاً ۲ پروسهٔ در حال اجرا بیشتر نداریم: یکی کامند ps و دیگری بَش مرتبط با این ترمینال. با این حال، با استفاده از آپشن u- می‌توان پروسه‌های مختص به یک کاربر خاص را نمایش داد؛ به طور مثال داریم:

$ ps -u behzadmoradi
  PID TTY          TIME CMD
 1210 ?        00:00:00 systemd
 1211 ?        00:00:00 (sd-pam)
.
.
.
11949 ?        00:02:15 chrome
13281 ?        00:00:15 chrome
13465 ?        00:00:00 gnome-terminal-
13474 pts/1    00:00:00 bash
15820 ?        00:00:01 gedit
15833 pts/1    00:00:00 ps

در خروجی فوق می‌بینیم که تمامی پروسه‌های کاربری تحت عنوان behzadmoradi نمایش داده شده‌اند. آپشن ef- کلیهٔ پروسه‌های سیستم را با جزئیات کامل در معرض دیدمان قرار خواهد داد و آپشن eLF- هم یک گام فراتر رفته و برای هر Thread به صورت مجزا اطلاعاتی تکمیلی را نمایش می‌دهد.

استفاده از کامند ps به سبک BSD

دستور ps را به شکل دیگری نیز می‌توان مورد استفاده قرار داد که به نوعی مرتبط با BSD UNIX است به طوری که آپشن‌های آن بدون استفاده از دَش (-) نوشته می‌شوند.

    نکته

Berkeley Software Distribution یا به اختصار BSD (توزیع نرم‌افزاری برکلی) یکی از مشتقات سیستم‌عامل UNIX بود که در دانشگاه برکلی منتشر می‌شد اما امروزه اصطلاح BSD یا BSD UNIX برای اشاره به خانواده‌ای از سیستم‌عامل‌های شبه‌یونیکس استفاده می‌شود.

برای مثال، کامند ps aux برای نمایش دادن کلیهٔ پروسه‌های تمامی کاربران استفاده می‌شود:

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     15906  0.0  0.0      0     0 ?        S    11:20   0:00 [kworker/1:0]
root     15922  0.0  0.0      0     0 ?        S    11:21   0:00 [kworker/u4:2]
.
.
.
root     16022  0.1  0.0      0     0 ?        S    11:24   0:00 [kworker/0:3]
root     16042  0.0  0.0      0     0 ?        S    11:26   0:00 [kworker/1:1]
root     16051  0.0  0.0      0     0 ?        S    11:26   0:00 [kworker/u4:1]
behzadm+ 16110  0.0  0.0  41332  3540 pts/1    R+   11:31   0:00 ps aux

و کامند ps axo هم این امکان را به کاربر می‌دهد تا اَتریبوت‌ یا ویژگی‌های مد نظرش را به عنوان پارامترهای اضافی مشخص سازد: 

$ ps axo stat,priority,pid,pcpu,comm
STAT PRI   PID %CPU COMMAND
Sl    20 13281  1.4 chrome
Rsl   20 13465  0.2 gnome-terminal-
Ss    20 13474  0.0 bash
Ss    20 15591  0.0 bluetoothd
R     20 15776  0.0 kworker/u4:0
Sl    20 15820  0.4 gedit
.
.
.
S     20 15906  0.0 kworker/1:0
S     20 15922  0.0 kworker/u4:2
S     20 16022  0.1 kworker/0:3
S     20 16042  0.0 kworker/1:1
S     20 16051  0.0 kworker/u4:1
R+    20 16117  0.0 ps

آشنایی با مفهوم Process Tree (درخت پروسه)

ابزاری تحت عنوان pstree در لینوکس نظر گرفته شده است که کلیهٔ پروسه‌هایی که در حال اجرا هستند را در قالب یک نمودار درختی در معرض دید کاربر قرار می‌دهد و این در حالی است که ارتباط مابین یک پروسه و پروسه‌ٔ والدش (Parent) و پروسه‌های فرزندش (Child) هم نمایش داده می‌شوند (لازم به ذکر است که تِرِدها داخل { } نمایش داده می‌شوند):

$ pstree
systemd─┬─ModemManager─┬─{gdbus}
        │              └─{gmain}
        ├─NetworkManager─┬─dhclient
        │                ├─{gdbus}
        │                └─{gmain}
        ├─accounts-daemon─┬─{gdbus}
        │                 └─{gmain}
        ├─acpid
        ├─agetty
        ├─apache2───5*[apache2]
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─colord─┬─{gdbus}
        │        └─{gmain}
        ├─cron
        ├─cups-browsed─┬─{gdbus}
        │              └─{gmain}
        ├─cupsd───dbus
        ├─dbus-daemon
        ├─fwupd─┬─{GUsbEventThread}
        │       ├─{fwupd}
        │       ├─{gdbus}
        │       └─{gmain}
        ├─ibus-daemon─┬─ibus-dconf─┬─{dconf worker}
        │             │            ├─{gdbus}
        │             │            └─{gmain}
        │             ├─ibus-engine-sim─┬─{gdbus}
        │             │                 └─{gmain}
        │             ├─ibus-ui-gtk3─┬─{dconf worker}
        │             │              ├─{gdbus}
        │             │              └─{gmain}
        │             ├─{gdbus}
        │             └─{gmain}
        ├─ibus-x11─┬─{gdbus}
        │          └─{gmain}
        ├─irqbalance
        ├─lightdm─┬─Xorg───{InputThread}
        │         ├─lightdm─┬─run-systemd-ses─┬─ssh-agent
        │         │         │                 └─systemctl
        │         │         ├─{gdbus}
        │         │         └─{gmain}
        │         ├─{gdbus}
        │         └─{gmain}
        ├─mysqld───27*[{mysqld}]
        ├─packagekitd─┬─{gdbus}
        │             └─{gmain}
        ├─polkitd─┬─{gdbus}
        │         └─{gmain}
        ├─repowerd─┬─{Backlight}
        │          ├─{DBusService}
        │          ├─{Logind}
        │          ├─{Ofono}
        │          ├─{PowerButton}
        │          ├─{RepowerdService}
        │          ├─{SystemPower}
        │          ├─{TempSuspendInhi}
        │          ├─{Timer}
        │          ├─{UPower}
        │          ├─{UserActivity}
        │          ├─{Wakeup}
        │          ├─{gdbus}
        │          └─{gmain}
        ├─rsyslogd─┬─{in:imklog}
        │          ├─{in:imuxsock}
        │          └─{rs:main Q:Reg}
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─sendmail-mta
        ├─snapd───7*[{snapd}]
        ├─systemd─┬─(sd-pam)
        │         ├─at-spi-bus-laun─┬─dbus-daemon
        │         │                 ├─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─at-spi2-registr─┬─{gdbus}
        │         │                 └─{gmain}
        │         ├─bamfdaemon─┬─{gdbus}
        │         │            ├─{gmain}
        │         │            └─{pool}
        │         ├─chrome─┬─2*[cat]
        │         │        ├─chrome─┬─chrome─┬─2*[chrome─┬─{Chrome_ChildIOT}]
        │         │        │        │        │           ├─2*[{CompositorTileW}+
        │         │        │        │        │           ├─{Compositor}]
        │         │        │        │        │           ├─{GpuMemoryThread}]
        │         │        │        │        │           ├─{Renderer::FILE}]
        │         │        │        │        │           ├─{TaskSchedulerRe}]
        │         │        │        │        │           └─{TaskSchedulerSe}]
        │         │        │        │        ├─2*[chrome─┬─{Chrome_ChildIOT}]
        │         │        │        │        │           ├─2*[{CompositorTileW}+
        │         │        │        │        │           ├─{Compositor}]
        │         │        │        │        │           ├─{GpuMemoryThread}]
        │         │        │        │        │           ├─{Renderer::FILE}]
        │         │        │        │        │           ├─2*[{TaskSchedulerRe}+
        │         │        │        │        │           └─{TaskSchedulerSe}]
        │         │        │        │        ├─chrome─┬─{Chrome_ChildIOT}
        │         │        │        │        │        ├─2*[{CompositorTileW}]
        │         │        │        │        │        ├─{Compositor}
        │         │        │        │        │        ├─{GpuMemoryThread}
        │         │        │        │        │        ├─{Renderer::FILE}
        │         │        │        │        │        ├─{ScriptStreamerT}
        │         │        │        │        │        ├─2*[{TaskSchedulerRe}]
        │         │        │        │        │        └─{TaskSchedulerSe}
        │         │        │        │        ├─chrome─┬─{Chrome_ChildIOT}
        │         │        │        │        │        ├─2*[{CompositorTileW}]
        │         │        │        │        │        ├─{Compositor}
        │         │        │        │        │        ├─{GpuMemoryThread}
        │         │        │        │        │        ├─{Renderer::FILE}
        │         │        │        │        │        ├─{ScriptStreamerT}
        │         │        │        │        │        ├─3*[{TaskSchedulerRe}]
        │         │        │        │        │        └─{TaskSchedulerSe}
        │         │        │        │        └─chrome─┬─{Chrome_ChildIOT}
        │         │        │        │                 ├─2*[{CompositorTileW}]
        │         │        │        │                 ├─{Compositor}
        │         │        │        │                 ├─{GpuMemoryThread}
        │         │        │        │                 ├─{Media}
        │         │        │        │                 ├─{Renderer::FILE}
        │         │        │        │                 ├─{ScriptStreamerT}
        │         │        │        │                 ├─3*[{TaskSchedulerRe}]
        │         │        │        │                 └─{TaskSchedulerSe}
        │         │        │        └─nacl_helper
        │         │        ├─chrome─┬─chrome
        │         │        │        ├─{Chrome_ChildIOT}
        │         │        │        ├─{TaskSchedulerSe}
        │         │        │        └─{Watchdog}
        │         │        ├─{AudioThread}
        │         │        ├─{BrowserWatchdog}
        │         │        ├─{Chrome_CacheThr}
        │         │        ├─{Chrome_DBThread}
        │         │        ├─{Chrome_FileThre}
        │         │        ├─{Chrome_FileUser}
        │         │        ├─{Chrome_HistoryT}
        │         │        ├─{Chrome_IOThread}
        │         │        ├─{Chrome_ProcessL}
        │         │        ├─{Chrome_SyncThre}
        │         │        ├─{CompositorTileW}
        │         │        ├─{CrShutdownDetec}
        │         │        ├─{D-Bus thread}
        │         │        ├─{IndexedDB}
        │         │        ├─{LevelDBEnv}
        │         │        ├─{NetworkChangeNo}
        │         │        ├─2*[{TaskSchedulerBa}]
        │         │        ├─2*[{TaskSchedulerFo}]
        │         │        ├─{TaskSchedulerSe}
        │         │        ├─{WorkerPool/1102}
        │         │        ├─2*[{WorkerPool/1193}]
        │         │        ├─4*[{WorkerPool/1328}]
        │         │        ├─{WorkerPool/9190}
        │         │        ├─{chrome}
        │         │        ├─{dconf worker}
        │         │        ├─{extension_crash}
        │         │        ├─{gdbus}
        │         │        ├─{gmain}
        │         │        ├─{gpu-process_cra}
        │         │        ├─{inotify_reader}
        │         │        ├─{renderer_crash_}
        │         │        ├─{sandbox_ipc_thr}
        │         │        └─{threaded-ml}
        │         ├─compiz─┬─{dconf worker}
        │         │        ├─{gdbus}
        │         │        ├─{gmain}
        │         │        └─2*[{pool}]
        │         ├─dbus-daemon
        │         ├─dconf-service─┬─{gdbus}
        │         │               └─{gmain}
        │         ├─evolution-addre─┬─evolution-addre─┬─{dconf worker}
        │         │                 │                 ├─{evolution-addre}
        │         │                 │                 ├─{gdbus}
        │         │                 │                 └─{gmain}
        │         │                 ├─{dconf worker}
        │         │                 ├─{evolution-addre}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─evolution-calen─┬─evolution-calen─┬─{dconf worker}
        │         │                 │                 ├─2*[{evolution-calen}]
        │         │                 │                 ├─{gdbus}
        │         │                 │                 ├─{gmain}
        │         │                 │                 └─{pool}
        │         │                 ├─evolution-calen─┬─{dconf worker}
        │         │                 │                 ├─{evolution-calen}
        │         │                 │                 ├─{gdbus}
        │         │                 │                 └─{gmain}
        │         │                 ├─{dconf worker}
        │         │                 ├─{evolution-calen}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─evolution-sourc─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─gconfd-2
        │         ├─gedit─┬─{dconf worker}
        │         │       ├─{gdbus}
        │         │       └─{gmain}
        │         ├─gnome-keyring-d─┬─{gdbus}
        │         │                 ├─{gmain}
        │         │                 └─{timer}
        │         ├─gnome-session-b─┬─deja-dup-monito─┬─{dconf worker}
        │         │                 │                 ├─{gdbus}
        │         │                 │                 └─{gmain}
        │         │                 ├─gnome-software─┬─{dconf worker}
        │         │                 │                ├─{gdbus}
        │         │                 │                └─{gmain}
        │         │                 ├─nautilus─┬─{dconf worker}
        │         │                 │          ├─{gdbus}
        │         │                 │          ├─{gmain}
        │         │                 │          └─2*[{pool}]
        │         │                 ├─nm-applet─┬─{dconf worker}
        │         │                 │           ├─{gdbus}
        │         │                 │           └─{gmain}
        │         │                 ├─polkit-gnome-au─┬─{dconf worker}
        │         │                 │                 ├─{gdbus}
        │         │                 │                 └─{gmain}
        │         │                 ├─unity-fallback-─┬─{dconf worker}
        │         │                 │                 ├─{gdbus}
        │         │                 │                 └─{gmain}
        │         │                 ├─update-notifier─┬─{dconf worker}
        │         │                 │                 ├─{gdbus}
        │         │                 │                 └─{gmain}
        │         │                 ├─zeitgeist-datah─┬─{gdbus}
        │         │                 │                 ├─{gmain}
        │         │                 │                 └─2*[{pool}]
        │         │                 ├─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─gnome-terminal-─┬─bash───pstree
        │         │                 ├─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─gpg-agent
        │         ├─gvfs-afc-volume─┬─{gdbus}
        │         │                 ├─{gmain}
        │         │                 └─{gvfs-afc-volume}
        │         ├─gvfs-goa-volume─┬─{gdbus}
        │         │                 └─{gmain}
        │         ├─gvfs-gphoto2-vo─┬─{gdbus}
        │         │                 └─{gmain}
        │         ├─gvfs-mtp-volume─┬─{gdbus}
        │         │                 └─{gmain}
        │         ├─gvfs-udisks2-vo─┬─{gdbus}
        │         │                 └─{gmain}
        │         ├─gvfsd─┬─{gdbus}
        │         │       └─{gmain}
        │         ├─gvfsd-dnssd─┬─{gdbus}
        │         │             └─{gmain}
        │         ├─gvfsd-fuse─┬─{gdbus}
        │         │            ├─{gmain}
        │         │            ├─{gvfs-fuse-sub}
        │         │            └─2*[{gvfsd-fuse}]
        │         ├─gvfsd-http─┬─{gdbus}
        │         │            └─{gmain}
        │         ├─gvfsd-metadata─┬─{gdbus}
        │         │                └─{gmain}
        │         ├─gvfsd-network─┬─{dconf worker}
        │         │               ├─{gdbus}
        │         │               └─{gmain}
        │         ├─gvfsd-trash─┬─{gdbus}
        │         │             └─{gmain}
        │         ├─hud-service─┬─{QDBusConnection}
        │         │             ├─{gdbus}
        │         │             └─{gmain}
        │         ├─indicator-appli─┬─{gdbus}
        │         │                 └─{gmain}
        │         ├─indicator-bluet─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─indicator-datet─┬─{QDBusConnection}
        │         │                 ├─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 ├─{gmain}
        │         │                 ├─3*[{indicator-datet}]
        │         │                 └─{pool}
        │         ├─indicator-keybo─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─indicator-messa─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─indicator-power─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─indicator-print─┬─{gdbus}
        │         │                 └─{gmain}
        │         ├─indicator-sessi─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─indicator-sound─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─libertined───{gmain}
        │         ├─notify-osd─┬─{dconf worker}
        │         │            ├─{gdbus}
        │         │            └─{gmain}
        │         ├─pulseaudio─┬─{alsa-sink-92HD7}
        │         │            └─{alsa-source-92H}
        │         ├─telegram-deskto─┬─sh───pxgsettings─┬─{dconf worker}
        │         │                 │                  ├─{gdbus}
        │         │                 │                  └─{gmain}
        │         │                 ├─3*[{MTP::internal::}]
        │         │                 ├─{QDBusConnection}
        │         │                 ├─3*[{QThread}]
        │         │                 ├─{QXcbEventReader}
        │         │                 ├─3*[{Qt HTTP thread}]
        │         │                 ├─{Qt bearer threa}
        │         │                 ├─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─thunderbird─┬─{Cache2 I/O}
        │         │             ├─{Compositor}
        │         │             ├─{DOM Worker}
        │         │             ├─3*[{DataStorage}]
        │         │             ├─{GMPThread}
        │         │             ├─{Gecko_IOThread}
        │         │             ├─{HTML5 Parser}
        │         │             ├─{Hang Monitor}
        │         │             ├─{IPDL Background}
        │         │             ├─{ImageBridgeChil}
        │         │             ├─{ImageIO}
        │         │             ├─{ImgDecoder #1}
        │         │             ├─{ImgDecoder #2}
        │         │             ├─6*[{JS Helper}]
        │         │             ├─{JS Watchdog}
        │         │             ├─{Link Monitor}
        │         │             ├─{Proxy R~olution}
        │         │             ├─{Socket Thread}
        │         │             ├─{SoftwareVsyncTh}
        │         │             ├─{Timer}
        │         │             ├─{URL Classifier}
        │         │             ├─{dconf worker}
        │         │             ├─{gdbus}
        │         │             ├─{gmain}
        │         │             ├─{localStorage DB}
        │         │             ├─{mozStorage #1}
        │         │             ├─{mozStorage #2}
        │         │             ├─{mozStorage #3}
        │         │             ├─{mozStorage #4}
        │         │             ├─{mozStorage #5}
        │         │             ├─{mozStorage #6}
        │         │             ├─{mozStorage #7}
        │         │             ├─{threaded-ml}
        │         │             └─5*[{thunderbird}]
        │         ├─unity-panel-ser─┬─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 └─{gmain}
        │         ├─unity-settings-─┬─syndaemon
        │         │                 ├─{dconf worker}
        │         │                 ├─{gdbus}
        │         │                 ├─{gmain}
        │         │                 ├─{pool}
        │         │                 └─{threaded-ml}
        │         ├─window-stack-br───{QDBusConnection}
        │         ├─zeitgeist-daemo─┬─{gdbus}
        │         │                 └─{gmain}
        │         └─zeitgeist-fts─┬─{gdbus}
        │                         └─{gmain}
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-resolve
        ├─systemd-timesyn───{sd-resolve}
        ├─systemd-udevd
        ├─udisksd─┬─{cleanup}
        │         ├─{gdbus}
        │         ├─{gmain}
        │         └─{probing-thread}
        ├─unity-greeter-s─┬─{gdbus}
        │                 └─{gmain}
        ├─upowerd─┬─{gdbus}
        │         └─{gmain}
        ├─whoopsie─┬─{gdbus}
        │          └─{gmain}
        └─wpa_supplicant

نموداری که در بالا مشاهده می‌شود، یک نمونهٔ کامل از نمودار درختی پروسه‌ها است. 

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

online-support-icon