ps (process status ), Unix/Linux işletim sistemlerinde, sistemde çalışan processler hakkında bilgi almamıza yardımcı olan bir komuttur. Bu bilgi ise virtual files yani sanal dosyalardan gelir. Bu virtual dosyalar ise sistem tarafından /proc dizinine bağlanmıştır. En azından Virtual File System ve Processler hakkında temel bilginizin olması gerektiğini düşünüyorum. Blogta bir yerde, temel olarak ikiye ayrılan processlerden biri olan Background Processlerin özel bir türü olan Daemons'lara değinmiştim. İşte ben oraya link veremeyecek kadar üşengeç aynı zamanda blog için bir arama motoru geliştirmeyecek kadar da sorumsuzum. Belki ilerde bir arama motoru ile rahat bir şekilde ulaşabilirsiniz. Neyse bunları es geçelim ve ps komutu için bazı faydalı kullanımları hızlıca not edelim.
Başlıktaki komutu terminale yazdığımızda kullanılabilecek tüm optionlar karşımıza çıkmaktadır. Dilerseniz args-option-flag tartışması başlatabiliriz; tartışma sonuçlanana kadar bazen option bazen de flag diyeceğim. Başlığı terminalde çalıştırırsak eğer:
$ ps --help all
Usage:
ps [options]
Basic options:
-A, -e all processes
-a all with tty, except session leaders
a all with tty, including other users
-d all except session leaders
-N, --deselect negate selection
r only running processes
T all processes on this terminal
x processes without controlling ttys
...
...
...
gibi gibi sonuç alırız. Yalnızca ps komutunu herhangi bir flag almadan çalıştırırsak mevcut shell için çalışan processleri görüntüleriz. Aslında bu kısmı biraz uzatarak, virtual dosyaların bağlandığı /proc dizini ile ilgili bir şey göstermek istiyorum. Bu sayede şimdiye kadar kullandığım bazı kavramların küçük bir açıklamasını yapmış olurum. Tek bir snippet ile göstereceğim daha sonrasında ise açıklayacağım.
$ cd /proc/
$ ps
PID TTY TIME CMD
8693 pts/1 00:00:00 bash
10044 pts/1 00:00:00 ps
$ ls | grep 8693
8693
$ exit
#Yeni terminal
$ ls /proc/ | grep 8693
<<Çıktı YOK!>>
$ ps
PID TTY TIME CMD
10051 pts/0 00:00:00 bash
10074 pts/0 00:00:00 ps
$ ls /proc/ | grep 10051
10051
Her bir process hakkında bilgi, sanal dosyaların bağlandığı /proc/ dizininden alınmaktadır. İlk shell için yani PID'si 8693 olan process, /proc dizininde mevcutken, daha sonra mevcut shelli kapattığımızda processte yok oluyor ve tabi /proc dizininden de kalkıyor. Öyle bir anlatayım dedim. Artık kısa kısa notlarla ilerleyeceğim.
Sistemde çalışan tüm processler (Standart Format) için:
$ ps -A
#veya
$ ps -e
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 rcu_gp
4 ? 00:00:00 rcu_par_gp
5 ? 00:00:00 netns
7 ? 00:00:00 kworker/0:0H-events_highpri
9 ? 00:00:00 mm_percpu_wq
10 ? 00:00:00 rcu_tasks_rude_
11 ? 00:00:00 rcu_tasks_trace
12 ? 00:00:00 ksoftirqd/0
...
...
Sistemde çalışan tüm processler (BSD Fomat) için:
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 166996 12008 ? Ss 04:55 0:01 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 04:55 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 04:55 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 04:55 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< 04:55 0:00 [netns]
root 7 0.0 0.0 0 0 ? I< 04:55 0:00 [kworker/0:0H-events_highpri]
root 9 0.0 0.0 0 0 ? I< 04:55 0:00 [mm_percpu_wq]
root 10 0.0 0.0 0 0 ? S 04:55 0:00 [rcu_tasks_rude_]
...
...
...
Kodu çalıştıran kullanıcının altında çalışan tüm processleri listelemek için:
$ ps -x
PID TTY STAT TIME COMMAND
1893 ? Ss 0:00 /lib/systemd/systemd --user
1894 ? S 0:00 (sd-pam)
1901 ? S<sl 0:00 /usr/bin/pipewire
1902 ? Ssl 0:00 /usr/bin/pipewire-media-session
1903 ? S<sl 7:39 /usr/bin/pulseaudio --daemonize=no --log-target=journal
1913 ? Ss 0:01 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
1915 ? Sl 0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
1925 ? Ssl 0:00 /usr/libexec/xdg-document-portal
1926 ? Ssl 0:00 /usr/libexec/gvfsd
...
...
$ sudo -i
root@burak:~$ ps -x
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /sbin/init splash
2 ? S 0:00 [kthreadd]
3 ? I< 0:00 [rcu_gp]
4 ? I< 0:00 [rcu_par_gp]
5 ? I< 0:00 [netns]
7 ? I< 0:00 [kworker/0:0H-events_highpri]
9 ? I< 0:00 [mm_percpu_wq]
10 ? S 0:00 [rcu_tasks_rude_]
...
...
User'a göre processleri listelemek istersek:
$ ps -u burak
PID TTY TIME CMD
2419 ? 00:00:00 systemd
2420 ? 00:00:00 (sd-pam)
2428 ? 00:00:00 pipewire
2429 ? 00:00:00 pipewire-media-
2430 ? 00:00:11 pulseaudio
2441 ? 00:00:00 gnome-keyring-d
2450 ? 00:00:00 dbus-daemon
...
...
...
# veya
$ ps -fu burak
UID PID PPID C STIME TTY TIME CMD
burak 2419 1 0 01:22 ? 00:00:00 /lib/systemd/systemd --user
burak 2420 2419 0 01:22 ? 00:00:00 (sd-pam)
burak 2428 2419 0 01:22 ? 00:00:00 /usr/bin/pipewire
burak 2429 2419 0 01:22 ? 00:00:00 /usr/bin/pipewire-media-sess
burak 2430 2419 4 01:22 ? 00:00:13 /usr/bin/pulseaudio --daemon
burak 2441 1 0 01:22 ? 00:00:00 /usr/bin/gnome-keyring-daemo
burak 2450 2419 0 01:22 ? 00:00:00 /usr/bin/dbus-daemon --sessi
...
...
...
Belirli bir processin threadini filtrelemek için:
$ ps -e | grep firefox
3424 ? 00:04:22 firefox
$ ps -L 3424
PID LWP TTY STAT TIME COMMAND
3424 3424 ? Sl 0:59 /snap/firefox/1810/usr/lib/firefox/firefox
3424 3618 ? Sl 0:07 /snap/firefox/1810/usr/lib/firefox/firefox
3424 3619 ? Sl 0:00 /snap/firefox/1810/usr/lib/firefox/firefox
3424 3620 ? Sl 0:00 /snap/firefox/1810/usr/lib/firefox/firefox
3424 3621 ? Sl 0:02 /snap/firefox/1810/usr/lib/firefox/firefox
...
...
...
Belirli bir grupla ilgili processleri listelemek için:
$ ps -fG www-data
UID PID PPID C STIME TTY TIME CMD
www-data 965 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 966 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 967 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 968 964 0 01:13 ? 00:00:00 nginx: worker process
#VEYA
$ ps -fG 33
UID PID PPID C STIME TTY TIME CMD
www-data 965 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 966 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 967 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 968 964 0 01:13 ? 00:00:00 nginx: worker process
PPID veya PID'sine göre process listlemek için:
$ ps -f --ppid 964
UID PID PPID C STIME TTY TIME CMD
www-data 965 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 966 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 967 964 0 01:13 ? 00:00:00 nginx: worker process
www-data 968 964 0 01:13 ? 00:00:00 nginx: worker process
$ ps -fp 965
UID PID PPID C STIME TTY TIME CMD
www-data 965 964 0 01:13 ? 00:00:00 nginx: worker process
Bir processin PID'sini öğrenmek için:
$ ps -C nginx
PID TTY TIME CMD
964 ? 00:00:00 nginx
965 ? 00:00:00 nginx
966 ? 00:00:00 nginx
967 ? 00:00:00 nginx
968 ? 00:00:00 nginx
Tree diagram ile process listelemek için --forest veya f kullanın:
$ ps -f f -C nginx
UID PID PPID C STIME TTY STAT TIME CMD
root 964 1 0 01:13 ? Ss 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 965 964 0 01:13 ? S 0:00 \_ nginx: worker process
www-data 966 964 0 01:13 ? S 0:00 \_ nginx: worker process
www-data 967 964 0 01:13 ? S 0:00 \_ nginx: worker process
www-data 968 964 0 01:13 ? S 0:00 \_ nginx: worker process
Son olarak istediğimiz formatta çıktı almak istiyorsak -o ile bunu yapabiliriz. Kullanılabilir tüm format türleri için:
$ ps L
%cpu %CPU
%mem %MEM
_left LLLLLLLL
_left2 L2L2L2L2
_right RRRRRRRR
_right2 R2R2R2R2
_unlimited U
_unlimited2 U2
alarm ALARM
args COMMAND
atime TIME
blocked BLOCKED
bsdstart START
bsdtime TIME
c C
caught CAUGHT
cgname CGNAME
cgroup CGROUP
class CLS
cls CLS
cmd CMD
comm COMMAND
command COMMAND
context CONTEXT
cp CP
cpuid CPUID
cputime TIME
cputimes TIME
drs DRS
dsiz DSIZ
egid EGID
egroup EGROUP
eip EIP
esp ESP
etime ELAPSED
etimes ELAPSED
euid EUID
euser EUSER
exe EXE
f F
fgid FGID
fgroup FGROUP
flag F
flags F
fname COMMAND
fsgid FSGID
fsgroup FSGROUP
fsuid FSUID
fsuser FSUSER
fuid FUID
fuser FUSER
gid GID
group GROUP
ignored IGNORED
intpri PRI
ipcns IPCNS
label LABEL
lastcpu C
lim LIM
longtname TTY
lsession SESSION
lstart STARTED
luid LUID
lwp LWP
lxc LXC
m_drs DRS
m_size SIZE
m_trs TRS
machine MACHINE
maj_flt MAJFL
majflt MAJFLT
min_flt MINFL
minflt MINFLT
mntns MNTNS
netns NETNS
ni NI
nice NI
nlwp NLWP
numa NUMA
nwchan WCHAN
opri PRI
ouid OWNER
pagein PAGEIN
pcpu %CPU
pending PENDING
pgid PGID
pgrp PGRP
pid PID
pidns PIDNS
pmem %MEM
policy POL
ppid PPID
pri PRI
pri_api API
pri_bar BAR
pri_baz BAZ
pri_foo FOO
priority PRI
psr PSR
rgid RGID
rgroup RGROUP
rss RSS
rssize RSS
rsz RSZ
rtprio RTPRIO
ruid RUID
ruser RUSER
s S
sched SCH
seat SEAT
sess SESS
session SESS
sgi_p P
sgi_rss RSS
sgid SGID
sgroup SGROUP
sid SID
sig PENDING
sig_block BLOCKED
sig_catch CATCHED
sig_ignore IGNORED
sig_pend SIGNAL
sigcatch CAUGHT
sigignore IGNORED
sigmask BLOCKED
size SIZE
slice SLICE
spid SPID
stackp STACKP
start STARTED
start_stack STACKP
start_time START
stat STAT
state S
stime STIME
suid SUID
supgid SUPGID
supgrp SUPGRP
suser SUSER
svgid SVGID
svgroup SVGROUP
svuid SVUID
svuser SVUSER
sz SZ
tgid TGID
thcount THCNT
tid TID
time TIME
times TIME
tname TTY
tpgid TPGID
trs TRS
trss TRSS
tsig PENDING
tsiz TSIZ
tt TT
tty TT
tty4 TTY
tty8 TTY
ucmd CMD
ucomm COMMAND
uid UID
uid_hack UID
uname USER
unit UNIT
user USER
userns USERNS
util C
utsns UTSNS
uunit UUNIT
vsize VSZ
vsz VSZ
wchan WCHAN
wname WCHAN
zone ZONE
Kendi formatımız için örneğin:
$ ps -G www-data -o pid,time,cmd,fgroup
PID TIME CMD FGROUP
965 00:00:00 nginx: worker process www-data
966 00:00:00 nginx: worker process www-data
967 00:00:00 nginx: worker process www-data
968 00:00:00 nginx: worker process www-data
$ ps -G burak -o pid,time,cmd f
PID TIME CMD
2406 00:00:00 gdm-session-worker [pam/gdm-password]
2565 00:00:00 \_ /usr/libexec/gdm-wayland-session env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --session=ubun
2572 00:00:00 \_ /usr/libexec/gnome-session-binary --session=ubuntu
2441 00:00:00 /usr/bin/gnome-keyring-daemon --daemonize --login
2419 00:00:00 /lib/systemd/systemd --user
2420 00:00:00 \_ (sd-pam)
2428 00:00:00 \_ /usr/bin/pipewire
2429 00:00:00 \_ /usr/bin/pipewire-media-session
Yine custom bir format ile bir processin PID'si ile process ismini bulmak için:
$ ps -p 964 -o comm=
nginx
Sanırım bu ps komutu için bu kadar kullanımı göstermek yeterli olacak. Çünkü istediğimiz kadar farklı kombinasyonları denersek buranın sonu gelmez. İhtiyaca göre özelleştirilebilinir.
İletişime geçmek, yorum bırakmak veya hatalarımı düzetlmek istersen mail atabilirsin.