I was looking for the best way to find the number of running processes with the same name via the command line in Linux. For example if I wanted to find the number of bash processes running and get "5". Currently I have a script that does a 'pidof ' and then does a count on the tokenized string. This works fine but I was wondering if there was a better way that can be done entirely via the command line. Thanks in advance for your help.
-
Is there a way to get a rolling count, especially of the number of tasks which match a specific string? Something like `top | grep TaskName | wc -l` – Beth Long Dec 08 '22 at 16:42
10 Answers
On systems that have pgrep
available, the -c
option returns a count of the number of processes that match the given name
pgrep -c command_name
Note that this is a grep
-style match, not an exact match, so e.g. pgrep sh
will also match bash
processes. If you want an exact match, also use the -x
option.
If pgrep
is not available, you can use ps
and wc
.
ps -C command_name --no-headers | wc -l
The -C
option to ps
takes command_name
as an argument, and the program prints a table of information about processes whose executable name matches the given command name. This is an exact match, not grep
-style. The --no-headers
option suppresses the headers of the table, which are normally printed as the first line. With --no-headers
, you get one line per process matched. Then wc -l
counts and prints the number of lines in its input.

- 128,184
- 27
- 255
- 279
-
1Wiping out the headers is good for some reason, when I run ps there's 2 processes and when I run `ps --no-headers | wc -l` there's 3 processes. It seems to count the initial newline? – CMCDragonkai Jun 02 '14 at 05:31
-
1Hmm, looks like `pgrep -c` is not an option on OpenBSD / Darwin. Could you add a little explanation of why you've selected those flags ( for both commands ) ? Without some explanation it makes it tough for users on a different distro to even use a `man` page to try and translate your intentions... – cwd Mar 29 '15 at 02:46
-
1Simple `ps --no-headers | wc -l` gives me 4 instead of 3 processes (that you'd see under `ps --no-headers`). What might be the case here? – krzemian Jan 12 '17 at 12:19
-
-
@DavidZ Try `ps >> test`, then see if `wc -l test` and `ps | wc -l` give the same results. In my case they differ by 1, which bugs me (like a lot). – krzemian Jan 17 '17 at 18:11
You can try :
ps -ef | grep -cw [p]rocess_name
OR
ps aux | grep -cw [p]rocess_name
For e.g.,:
ps -ef | grep -cw [i]nit

- 547
- 3
- 12

- 95
- 1
- 1
Some of the above didn't work for me, but they helped me on my way to this.
ps aux | grep [j]ava -c
For newbies to Linux:
ps aux
prints all the currently running processes, grep
searches for all processes that match the word java, the []
brackets remove the process you just ran so it wont include that as a running process and finally the -c
option stands for count.

- 58,613
- 19
- 146
- 147

- 31
- 1
List all process names, sort and count
ps --no-headers -A -o comm | sort | uniq -c
You also can list process attached to a tty
ps --no-headers a -o comm | sort | uniq -c
You may filter with:
ps --no-headers -A -o comm | awk '{ list[$1] ++ } END { for (i in list) { if (list[i] > 10) printf ("%20s: %s\n", i, list[i]) } }'

- 757
- 6
- 10
You can use ps
(will show snapshot of processes) with wc
(will count number of words, wc -l
option will count lines i.e. newline characters).
Which is very easy and simple to remember.
ps -e | grep processName | wc -l
This simple command will print number of processes running on current server.
If you want to find the number of process running on current server for current user then use -U
option of ps
.
ps -U root | grep processName | wc -l
change root with username.
But as mentioned in lot of other answers you can also use ps -e | grep -c process_name
which is more elegant way.

- 820
- 10
- 21
ps aux | wc -l
This command shows number of processes running on the system by all the users.
For a specific user you can use the following command:
ps -u <username> | wc -l
replace with the actual username before running :)

- 2,960
- 5
- 28
- 55

- 411
- 5
- 9
Following bash script can be run as a cron job and you can possibly get email if any process forks itself too much.
for i in `ps -A -o comm= --sort=+comm | uniq`;
do
if (( `ps -C $i --no-headers | wc -l` > 10 )); then
echo `hostname` $i `ps -C $i --no-headers | wc -l` ;
fi
done
Replace 10 with your number of concern.
TODO: "10" could be passed as command line parameter as well. Also, few system processes can be put into exception list.

- 44
- 5
ps -awef | grep CAP | wc -l
Here "CAP" is the word which is in the my Process_Names.
This command output = Number of Processes + 1
This is why When we are running this command , our system read thats "ps -awef | grep CAP | wc -l " is also a process.
So yes our real answer is (Number of Processes) = Command Output - 1
Note : These processes are only those processes who include the name of "CAP"

- 21
- 2