35

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.

Traker
  • 2,147
  • 3
  • 23
  • 38
  • 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 Answers10

71

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.

David Z
  • 128,184
  • 27
  • 255
  • 279
  • 1
    Wiping 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
  • 1
    Hmm, 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
  • 1
    Simple `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
  • @krzemian hard to say without seeing what the processes are. – David Z Jan 12 '17 at 13: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
11
result=`ps -Al | grep command-name | wc -l`
echo $result
Amardeep AC9MF
  • 18,464
  • 5
  • 40
  • 50
8
ps -Al | grep -c bash
Alex B
  • 82,554
  • 44
  • 203
  • 280
6

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
sungtm
  • 547
  • 3
  • 12
3

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.

pb2q
  • 58,613
  • 19
  • 146
  • 147
3

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]) } }'
fraff
  • 757
  • 6
  • 10
1

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.

BreakBadSP
  • 820
  • 10
  • 21
1

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 :)

Anuvrat Parashar
  • 2,960
  • 5
  • 28
  • 55
spoorthi vaidya
  • 411
  • 5
  • 9
1

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.

Sury Soni
  • 44
  • 5
0

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"