PS is the acronym for Process Status.
The utility is used for displaying, filtering and sorting the running processes, in this tutorial I would like to cover most of the use cases, but also I would like to keep it as short as possible, so if I missed something important please comment below.
The ps command accepts several types of parameters, I will use the standard syntax, the Unix format combined with GNU long options and in very few cases the BSD options.
Available option types:
1. UNIX options, which may be grouped and must be preceded by a dash.
2. BSD options, which may be grouped and without dash.
3. GNU long options, which are preceded by two dashes.
Display current shell processes
When using ps
without any parameter the current shell instance will be displayed and also the processes started from the current shell.
ps
PID TTY TIME CMD
6922 pts/3 00:00:00 bash
7036 pts/3 00:00:00 ps
In my example the current shell is PID 6922, let’s demonstrate this by displaying $$ (PID of the current instance of shell).
echo $$
6922
Display current user processes
ps -x
PID TTY STAT TIME COMMAND
1111 ? Ss 0:00 /lib/systemd/systemd --user
1112 ? S 0:00 (sd-pam)
1115 ? Sl 0:01 /usr/bin/kwalletd5 --pam-login 15 3
1116 ? S 0:00 /bin/sh /usr/bin/startkde
1151 ? S 0:00 /usr/bin/dbus-launch --exit-with-session --sh-syntax
...
Display user processes
This will display all the processes started by a user, oueta in my example
ps -u oueta
PID TTY TIME CMD
3182 ? 00:00:00 systemd
3183 ? 00:00:00 (sd-pam)
3202 ? 00:00:00 ssh-agent
3552 ? 00:00:00 sshd
3553 pts/4 00:00:00 bash
...
Display every processes
ps -e
PID TTY TIME CMD
1 ? 00:00:04 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:22 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
...
Display every processes in BSD format
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 139088 6860 ? Ss Jan31 0:06 /sbin/init
root 2 0.0 0.0 0 0 ? S Jan31 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Jan31 0:31 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Jan31 0:00 [kworker/0:0H]
root 7 0.1 0.0 0 0 ? S Jan31 13:25 [rcu_sched]
...
Display processes by PID
ps -p 48387
PID TTY STAT TIME COMMAND
48387 ? S 0:00 /usr/sbin/apache2 -k start
Multiple PID's can be selected
ps -p 36423 33223 56562
PID TTY STAT TIME COMMAND
33223 ? S 0:00 /usr/sbin/apache2 -k start
36423 ? Ss 0:00 postgres: gitlab gitlabhq_production [local] idle
56562 ? S 0:37 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
Display processes by command
ps -C apache2,sshd
PID TTY TIME CMD
878 ? 00:00:00 sshd
1080 ? 00:00:17 apache2
1846 ? 00:00:00 sshd
2020 ? 00:00:00 sshd
2068 ? 00:00:00 sshd
2315 ? 00:00:17 apache2
30346 ? 00:00:00 apache2
30347 ? 00:00:00 apache2
...
Display by parent PID
ps --ppid 33963
PID TTY TIME CMD
38383 pts/3 00:00:00 sleep
38550 pts/3 00:00:00 ps
Display processes associated with terminals (ttys, or screens for text output)
ps -t tty1
PID TTY TIME CMD
864 tty1 00:00:00 agetty
Display process thread information
ps -efL
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 1 0 1 0 1 Jan31 ? 00:00:06 /sbin/init
root 2 0 2 0 1 Jan31 ? 00:00:00 [kthreadd]
root 3 2 3 0 1 Jan31 ? 00:00:31 [ksoftirqd/0]
root 5 2 5 0 1 Jan31 ? 00:00:00 [kworker/0:0H]
root 7 2 7 0 1 Jan31 ? 00:13:25 [rcu_sched]
...
Where NLWP (Number of Threads) and LWP (Thread ID).
Display every process scheduler information
ps -ec
PID CLS PRI TTY TIME CMD
1 TS 19 ? 00:00:06 systemd
2 TS 19 ? 00:00:00 kthreadd
3 TS 19 ? 00:00:30 ksoftirqd/0
5 TS 39 ? 00:00:00 kworker/0:0H
...
PRI: Priority of the process. Higher number means lower priority.
CLS: Scheduling class of the process.
Field's possible values are:
- not reported
TS SCHED_OTHER
FF SCHED_FIFO
RR SCHED_RR
B SCHED_BATCH
ISO SCHED_ISO
IDL SCHED_IDLE
? unknown value
Display security data
ps -eM
LABEL PID TTY TIME CMD
- 1 ? 00:00:06 systemd
- 2 ? 00:00:00 kthreadd
- 3 ? 00:00:31 ksoftirqd/0
- 5 ? 00:00:00 kworker/0:0H
...
Full-format listing
ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan31 ? 00:00:06 /sbin/init
root 2 0 0 Jan31 ? 00:00:00 [kthreadd]
root 3 2 0 Jan31 ? 00:00:30 [ksoftirqd/0]
...
Long-format listing
ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 34796 - ? 00:00:01 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 - ? 00:00:00 ksoftirqd/0
1 S 0 5 2 0 60 -20 - 0 - ? 00:00:00 kworker/0:0H
...
Display hierarchy view
ps -eH
...
1521 ? 00:00:00 lxc-autostart
1592 ? 00:00:01 systemd
1707 ? 00:00:03 systemd-journal
1785 ? 00:00:00 cron
1881 ? 00:00:00 dhclient
1933 pts/3 00:00:00 agetty
1937 pts/2 00:00:00 agetty
1938 pts/0 00:00:00 agetty
1939 pts/1 00:00:00 agetty
1940 pts/2 00:00:00 agetty
1944 ? 00:00:00 vsftpd
2020 ? 00:00:00 sshd
3182 ? 00:00:00 systemd
3183 ? 00:00:00 (sd-pam)
3202 ? 00:00:00 ssh-agent
6540 ? 00:00:00 screen
6541 pts/5 00:00:00 bash
...
Display forest view
ps -e --forest
1521 ? 00:00:00 lxc-autostart
1592 ? 00:00:01 \_ systemd
1707 ? 00:00:03 \_ systemd-journal
1785 ? 00:00:00 \_ cron
1881 ? 00:00:00 \_ dhclient
1933 pts/3 00:00:00 \_ agetty
1937 pts/2 00:00:00 \_ agetty
1938 pts/0 00:00:00 \_ agetty
1939 pts/1 00:00:00 \_ agetty
1940 pts/2 00:00:00 \_ agetty
1944 ? 00:00:00 \_ vsftpd
2020 ? 00:00:00 \_ sshd
3182 ? 00:00:00 systemd
3183 ? 00:00:00 \_ (sd-pam)
...
Display header every page
ps -e --headers
...
52833 ? 00:00:15 kworker/1:2
52958 ? 00:00:16 kworker/0:0
54104 ? 00:00:00 gitlab-logrotat
PID TTY TIME CMD
55548 ? 00:00:00 sleep
56558 ? 00:00:00 zabbix_agentd
...
Don't display the header
ps -e --no-headers
1 ? 00:00:06 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:30 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:13:17 rcu_sched
...
Sort by column ascending
In this example we will sort by the command
column.
ps -e --sort command
Sort by column descending
ps -e --sort -command
Display user-customized format
This is the most customizable and powerful feature of ps, you can display the desired columns.
ps -e -o pid,pcpu,pmem,command:5,user --sort -pcpu
PID %CPU %MEM COMMAND USER
2428 1.0 8.3 sidek 998
1315 0.9 0.0 [kwor root
61974 0.8 0.0 [kwor root
61973 0.6 0.0 [kwor root
2414 0.5 0.1 /opt/ 997
...
In my example I displayed five columns, the names are self explanatory also I restricted the command
column to 5 characters and sorted by pcpu
, as you already learned above, descending.
Note: This option can be combined with many options to add additional columns.
List all format specifiers
Display all the format specifiers which can be used with the -o flag, some keywords may not be available for sorting.
ps L
%cpu %CPU
%mem %MEM
_left LLLLLLLL
_left2 L2L2L2L2
_right RRRRRRRR
_right2 R2R2R2R2
_unlimited U
_unlimited2 U2
alarm ALARM
args COMMAND
...