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