How to show top five CPU consuming processes with ps?

12 Answers 12

up vote 74 down vote accepted

Why use ps when you can do it easily with the top command?

If you must use ps, try this:

ps aux | sort -nrk 3,3 | head -n 5

If you want something that's truly 'top'esq with constant updates, use watch

watch "ps aux | sort -nrk 3,3 | head -n 5"
  • 3
    ps aux | sort -k 3,3 | tail -n 5 ;-) – PlanasB May 28 '11 at 19:01
  • 1
    it will be good to include the numeric sort, to skip the header of ps aux. ps aux | sort -nrk 3,3 | head -n 5 – syss May 12 '16 at 10:42
  • 1
    this spawns many processes which is more resource consuming and is also more prone to race condition, because when the piped data comes to head the process list may have already changed – phuclv Jun 12 '17 at 9:20
  • This is true @LưuVĩnhPhúc but I wonder how this differs from how top actually works. – icedwater Jun 15 '17 at 2:50
  • 1
    @icedwater top reads the process list and display the result on its own without piping to any other process – phuclv Jun 15 '17 at 3:16

The correct answer is:

ps --sort=-pcpu | head -n 6

So you can specify columns without interfering with sorting.

Ex:

ps -Ao user,uid,comm,pid,pcpu,tty --sort=-pcpu | head -n 6

Note for MAC OS X: In Mac OS X, ps doesn't recognize --sort, but offers -r to sort by current CPU usage. Thus, for Mac OS X you can use:

ps -Ao user,uid,comm,pid,pcpu,tty -r | head -n 6
  • 1
    This IS the correct answer. Thank you Facundo. I was trying to explain to others that you can use sort and pipe it, but ps also comes built in with an option for sorting and now I see you also use it which is great. – Luis Alvarado Apr 7 '16 at 16:01
  • The 2nd command appears more useful... but the first one just seems to show bash (x2, or head as well) ps... – Wilf Jul 3 '17 at 18:19
  • 2
    @Wilf The first one is for highlighting how to sort by cpu consumption without using the command sort, the second one shows how to specify columns without interfering with sorting. When explaining something.. it's always better to be concise and explain one thing at a time. – Facundo Victor Jul 10 '17 at 10:29

Depending on your needs you may find this a little more readable:

ps -eo pcpu,pid,user,args --no-headers| sort -t. -nk1,2 -k4,4 -r |head -n 5

sample output:

 1.3     4 root     [ksoftirqd/0]
 1.1     9 root     [ksoftirqd/1]
 1.0 17606 nobody   /usr/sbin/gmetad
 1.0    13 root     [ksoftirqd/2]
 0.3 17401 nobody   /usr/sbin/gmond

(the fields are %CPU,PID,USER,COMMAND)

  • 1
    This doesn't sort xx.x and x.x digits correctly. I get a set of processes in this cpu usage order: %CPU PID USER COMMAND 6.9 3295 gearond /usr/lib/firefox/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 3216 true plugin 3.7 13665 gearond gnome-terminal 2.8 13672 gearond bash 2.6 1444 root /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none 12.5 3216 gearond /usr/lib/firefox/firefox – Dennis Mar 15 '15 at 16:02
  • right you are @Dennis. Good catch. I've updated my answer to correctly handle this. – Ryan Horrisberger Mar 16 '15 at 20:28
  • "more readable" result, but very ugly command.. – Hernán Eche Jul 22 '15 at 19:26

I don't think ps is what you are looking for. Have you looked at the output from top?

If you have GNU-Top, try using it's batch mode to spit out a process list sorted by cpu usage and using head/tail to get the top 5 lines (the first 8 are headers):

top -b -n 1 | head -n 12  | tail -n 5

The BSD top seems to behave differently and doesn't have a non-interactive mode, so use one of the other ps based solutions.

  • 1
    In OS X, is top -o cpu -n 5 a way of achieving the same thing. Does anyone know? My top is different to your top. – boehj May 29 '11 at 4:00
  • You're the one with the different top so you would be in a position to say. My top doesn't have -o and -n sets the number of times it refreshes the display before quitting. – Caleb May 29 '11 at 5:28
  • Fair enough. I'll get on a Linux box this afternoon and take a look. My top doesn't seem to have a batch mode, which is quite limiting. There must be some way of piping top into other commands. I'll do some research. – boehj May 29 '11 at 5:45
  • I mentioned the batch mode switch in my answer but it's actually unnecessary for my top because it auto-detects being part of a pipe instead of an interactive session. Did you try just piping it without that? – Caleb May 29 '11 at 5:56
  • 1
    Will do. GNU top worked as described this afternoon. Cheers. – boehj May 29 '11 at 12:05

Note that current versions of ps have sorting ability within them, based on field codes (given in the ps man page). The field code for processor usage is "c". You can use --sort c at the end of a ps command e.g. ps aux --sort c

This will put the process using the most cpu at the bottom of the list. Reverse order of the list by adding a minus to the field code used to sort e.g. ps aux --sort -c

The command line tool ps has its own sort option, so I prefer:

$ ps -eo pcpu,args --sort=-%cpu | head

You can add the columns you want. See what other options are available via the ps man page.

$ man ps

Quickest one liner I have found for this (note 6 because the header adds up):

ps aux k-pcpu | head -6

In order to add a point to other valuable answers, I prefer:

ps auxk-c | head -6

It also prints the header, which is nice.

Here k is identical to --sort and c specifies CPU usage (alias %cpu) field for sort, while - is for reverse sort.

You may add more specifiers separated by ,, other possible specifiers are : %mem, args, bsdstart, pid, gid, uid ... which you can find full list in STANDARD FORMAT SPECIFIERS section of man page. For example:

 ps auxk -gid,-%mem | head -11

would print 10 processes with highest group id, internally sorted by memory usage.

top on Mac OS X has a logging mode option in the form of top -l numberOfSamples (which seems to be the equivalent to the batch mode of GNU top). It is necessary, though, to have at least two samples because "the first sample displayed will have an invalid %CPU displayed for each process, as it is calculated using the delta between samples" (man 1 top).

# examples
top -o cpu -l 2 -n 5 | tail -n 6
top -o cpu -l 2 -n 5 -stats pid,command,cpu | tail -n 6
top -o cpu -l 2 -n 5 -stats pid,command,cpu -U $(logname) | tail -n 6

top will display what is using your CPU. If you have it installed, htop allows you more fine-grained control, including filtering by—in your case—CPU.

I believe the simplest way to see top 5 cpu consuming process is,

ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 5

To see top 5 memory consuming process is,

ps -eo pid,comm,%cpu,%mem --sort=-%mem | head -n 5

Where,

-e : This flag is used to select all process

-o : This flag is used to format as user-defined.

pid : This argument used for showing pid

comm: This argument used for showing command name only. To get full command use args, cmd or command

%cpu: This argument shows the percentage of cpu utilization of the process in "##.#" format. Here pcpu can also be used.

%mem: This argument shows the ratio of the process's resident set size to the physical memory on the machine, expressed as a percentage. Here pmem can also be used.

--sort: Specify sorting order. After = the - sign is used to sort highest value at the top where the default option which is + is to list increasing numerical order [i.e 0 to n].

top -bn1 |sed -n '7,12'p works as a nice little one liner too.
Though I do prefer to use ps with the --sort=X -o X,Y,Z

using ps you can pull different stats grep for a process OR user and then total OR avg them with a pipe to awk.

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.