Aniket
Aniket

Reputation: 360

ps -ef | grep * command not working properly

I have simple unix shell script as follows. Which is giving different count for a service

#!/bin/bash
service=$1

ps -ef | grep $service | grep -v "grep" | wc -l 
PROCESS_NUM=$(ps -ef | grep $service | grep -v "grep"| wc -l) 
echo $PROCESS_NUM

In the above code below line gives output of 2.

ps -ef | grep $service | grep -v "grep" | wc -l 

But when same line is assigned to variable as code below its giving output as 3.

PROCESS_NUM=$(ps -ef | grep $service | grep -v "grep"| wc -l) 
echo $PROCESS_NUM

Why this is getting increased by 1 and how to tackle it.

Upvotes: 0

Views: 916

Answers (1)

Jerry Jeremiah
Jerry Jeremiah

Reputation: 9618

You can see what is happening if the script tees the output to a file before counting the lines and then displaying the output after:

#!/bin/bash
service=$1

echo Directly in Script:
ps -ef | grep $service | grep -v grep | tee test.txt | wc -l
cat test.txt

echo Inside Subshell:
RESULT=$(ps -ef | grep $service | grep -v grep | tee test.txt | wc -l)
echo $RESULT
cat test.txt

When the output of a command is captured, bash starts another shell to run the command - but that subshell also shows up in the process list.

When I run that script I get:

$ ./test.sh lca
Directly in Script:
2
gcti      4268     1  0  2018 ?        21:59:03 ./lca 4999
t816826   9159  7009  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca
Inside Subshell:
3
gcti      4268     1  0  2018 ?        21:59:03 ./lca 4999
t816826   9159  7009  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca
t816826   9166  9159  0 09:22 pts/1    00:00:00 /bin/bash ./test.sh lca

Upvotes: 2

Related Questions