Unix/Linux processes FAQ: Can you share some examples of the Linux ps command? (Or, how do I use theps command?)
The basic Linux ps command
If you run the ps command by itself, it only shows very basic information about the processes you are currently running. For example, if you issue the basic command like this without any arguments:
ps
you'll see output from this command looks something like this:
PID TTY TIME CMD
4343 ttys000 0:00.35 -bash
2617 ttys001 0:00.65 -bash
18201 ttys003 0:00.27 -bash
The PID column shows the process-id, the second column shows the TTY (terminal) the process is attached to, the TIME column shows how much CPU time the process has used, and the CMD column shows the command that is running. In this case I can tell (from experience) that I have three bash shells (terminals) running on my current system.
In practice I never run the ps command without any arguments like this, but I wanted to show this to help us get started.
There are many ways to customize the output of the ps command. For instance, I can add the f argument to get "full" information about each process. Used by itself, the f argument shows "full" information about just my processes. As an example, this command:
ps -f
leads to this output:
UID PID PPID C STIME TTY TIME CMD
501 4343 4342 0 0:00.18 ttys000 0:00.35 -bash
501 2617 2616 0 0:00.41 ttys001 0:00.66 -bash
501 18201 18200 0 0:00.15 ttys003 0:00.27 -bash
As you can see this adds a few more columns of output to my ps command, including UID (user-id), PPID (parent process-id), and a couple of other columns I don't really look at.
Showing information about every process
As mentioned, those two ps command examples just show information about your processes. If you're a Linux system administrator, you're typically interested in information about all the processes running on the system. To show every process running on the system, we add the e argument to our previous ps command, like this:
ps -ef
This leads to much more output:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Oct21 ? 00:00:01 init [3]
root 2 1 0 Oct21 ? 00:00:00 [migration/0]
root 3 1 0 Oct21 ? 00:00:00 [ksoftirqd/0]
root 4 1 0 Oct21 ? 00:00:00 [watchdog/0]
root 5 1 0 Oct21 ? 00:00:00 [migration/1]
root 6 1 0 Oct21 ? 00:00:00 [ksoftirqd/1]
root 7 1 0 Oct21 ? 00:00:00 [watchdog/1]
root 8 1 0 Oct21 ? 00:00:00 [events/0]
root 9 1 0 Oct21 ? 00:00:00 [events/1]
root 10 1 0 Oct21 ? 00:00:00 [khelper]
root 11 1 0 Oct21 ? 00:00:00 [kthread]
root 15 11 0 Oct21 ? 00:00:00 [kblockd/0]
root 16 11 0 Oct21 ? 00:00:00 [kblockd/1]
root 17 11 0 Oct21 ? 00:00:00 [kacpid]
root 91 11 0 Oct21 ? 00:00:00 [cqueue/0]
root 92 11 0 Oct21 ? 00:00:00 [cqueue/1]
root 95 11 0 Oct21 ? 00:00:00 [khubd]
root 97 11 0 Oct21 ? 00:00:00 [kseriod]
root 158 11 0 Oct21 ? 00:00:00 [pdflush]
That was actually just the first 20 lines of output from this ps command on my CentOS Linux test system. This command actually generated 99 lines of output, and I cropped it to just show the first 20 lines (using ps -ef | head -20).
As mentioned, that's the older way to list processes on a Unix system (and it may still be preferred on Unix systems like HP-UX, AIX, and Solaris; I don't really know, I just use Linux and Mac OS X these days). I wanted to show these options to you (a) to help you learn about the ps command, and (b) see that there are other ps command options than what most people use on a day to day basis. Given that background, let's take a look at how the ps command is typically used on Linux systems.
How the Linux ps command is typically used
Now that you've seen some ps command arguments and sample output, here's how I run the ps command about 80% of the time:
ps auxwww | more
The first 20 lines of output from this command look like this:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2064 620 ? Ss Oct21 0:01 init [3]
root 2 0.0 0.0 0 0 ? S< Oct21 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN Oct21 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S< Oct21 0:00 [watchdog/0]
root 5 0.0 0.0 0 0 ? S< Oct21 0:00 [migration/1]
root 6 0.0 0.0 0 0 ? SN Oct21 0:00 [ksoftirqd/1]
root 7 0.0 0.0 0 0 ? S< Oct21 0:00 [watchdog/1]
root 8 0.0 0.0 0 0 ? S< Oct21 0:00 [events/0]
root 9 0.0 0.0 0 0 ? S< Oct21 0:00 [events/1]
root 10 0.0 0.0 0 0 ? S< Oct21 0:00 [khelper]
root 11 0.0 0.0 0 0 ? S< Oct21 0:00 [kthread]
root 15 0.0 0.0 0 0 ? S< Oct21 0:00 [kblockd/0]
root 16 0.0 0.0 0 0 ? S< Oct21 0:00 [kblockd/1]
root 17 0.0 0.0 0 0 ? S< Oct21 0:00 [kacpid]
root 91 0.0 0.0 0 0 ? S< Oct21 0:00 [cqueue/0]
root 92 0.0 0.0 0 0 ? S< Oct21 0:00 [cqueue/1]
root 95 0.0 0.0 0 0 ? S< Oct21 0:00 [khubd]
root 97 0.0 0.0 0 0 ? S< Oct21 0:00 [kseriod]
root 158 0.0 0.0 0 0 ? S Oct21 0:00 [pdflush]
As you can see, this output is similar to the earlier output, but the columns are different. Before I talk about these ps command arguments, let me show a few more examples. Here's how I look at all httpd processes running on my Linux system:
$ ps auxwww | grep http
root 2928 0.0 0.6 17648 7120 ? Ss Oct21 0:00 /usr/local/apache2/bin/httpd -k start
nobody 2949 0.0 0.6 17648 6492 ? S Oct21 0:00 /usr/local/apache2/bin/httpd -k start
nobody 2950 0.0 0.6 17648 6492 ? S Oct21 0:00 /usr/local/apache2/bin/httpd -k start
nobody 2951 0.0 0.6 17648 6492 ? S Oct21 0:00 /usr/local/apache2/bin/httpd -k start
nobody 2952 0.0 0.6 17648 6492 ? S Oct21 0:00 /usr/local/apache2/bin/httpd -k start
nobody 2953 0.0 0.6 17648 6492 ? S Oct21 0:00 /usr/local/apache2/bin/httpd -k start
root 18508 0.0 0.0 3916 688 pts/0 S+ 11:12 0:00 grep http
Here's how I list all my mysql processes:
$ ps auxwww | grep mysql
root 2837 0.0 0.1 4528 1236 ? S Oct21 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid
mysql 2897 0.0 1.7 136700 17952 ? Sl Oct21 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock
root 18510 0.0 0.0 3916 712 pts/0 S+ 11:13 0:00 grep mysql
Now that you've seen a few ps command examples, this is what the arguments to this ps command mean:
◉ The a argument means "show all processes", not just my processes. (There's a bit more to it than that, but this is usually close enough.)
◉ The u argument adds "user information" columns to the output. (Try your ps command without the 'u', and you'll see a major difference in the columns that are displayed.)
◉ The x lifts the BSD-style "must have a tty" restriction, meaning it will show processes that are not associated with a terminal (tty)>
◉ The w means "wide output". Use this option twice for unlimited width.
Examples from the Linux ps command man page
My intention for this article was to help get a new Unix or Linux user get started with the ps command. Before going, there are two more things I want to share with you.
First, there are many different variations of the ps command that you can use if you want to. For instance, I just looked at the Linux ps man page, and found these examples:
EXAMPLES
To see every process on the system using standard syntax:
ps -e
ps -ef
ps -eF
ps -ely
To see every process on the system using BSD syntax:
ps ax
ps axu
To print a process tree:
ps -ejH
ps axjf
To get info about threads:
ps -eLf
ps axms
To get security info:
ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM
To see every process running as root (real & effective ID) in user format:
ps -U root -u root u
To see every process with a user-defined format:
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -eopid,tt,user,fname,tmout,f,wchan
Print only the process IDs of syslogd:
ps -C syslogd -o pid=
Print only the name of PID 42:
ps -p 42 -o comm=