views:

50

answers:

3

I am using the following script to get the running process to print the id, command..


if [ "`uname`" = "SunOS" ]  
then  
  awk_c="nawk"  
  ps_d="/usr/ucb/"  
  time_parameter=7  
else  
  awk_c="awk"  
  ps_d=""  
  time_parameter=5  
fi  

main_class=RiskEngine  
connection_string=db.regression  

AWK_CMD='BEGIN{printf "%-15s %-6s %-8s %s\n","ID","PID","STIME","Cmd"} {printf "%-15s %-6s %-8s %s %s %s\n","MY_APP",$2,$time_parameter, main_class, connection_string, port}'  

while getopts ":pnh" opt; do  
  case $opt in  
    p) AWK_CMD='{ print $2 }'  
       do_print_message=1;;  
    n) AWK_CMD='{printf "%-15s %-6s %-8s %s %s %s\n","MY_APP",$2,$time_parameter,main_class, connection_string, port}' ;;  
    h) print "usage  :  `basename ${0}` {-p} {-n}    : Returns details of process running "  
       print "  -p   :   Returns a list of PIDS"  
       print "  -n   :   Returns process list without preceding header"  
       exit 1 ;  

  esac  
done  

ps auxwww | grep $main_class | grep 10348 | grep -v grep | ${awk_c} -v main_class=$merlin_main_class -v connection_string=$merlin_connection_
string -v port=10348 -v time_parameter=$time_parameter "$AWK_CMD"  

# cat /etc/redhat-release  
Red Hat Enterprise Linux AS release 4 (Nahant Update 6)  
# uname -a  
Linux deapp25v 2.6.9-67.0.4.EL #1 Fri Jan 18 04:49:54 EST 2008 x86_64 x86_64 x86_64 GNU/Linux  

When I am executing the following from the script independently or inside script

# ps auxwww | grep $main_class | grep 10348 | grep -v grep | ${awk_c} -v main_class=$merlin_main_class -v connection_string=$merlin_connection_string -v port=10348 -v time_parameter=$time_parameter "$AWK_CMD"  

I get two rows on Linux:

ID              PID    STIME    Cmd  
MY_APP      6217   2355352   RiskEngine 10348  
MY_APP      21874  5316      RiskEngine 10348  

I just have one jvm (Java command) running in the background but still I see 2 rows.

I know one of them (Duplicate with pid 21874) comes from awk command that I am executing. It includes again the main class and the port so two rows. Can you please help me to avoid the one that is duplicate row?

Can you please help me?

A: 

You're already using the grep -v grep trick in your code, why not just update it to exclude the awk process as well with grep -v ${awk_c}?

In other words, the last line of your script would be (on one line and with the real command parameters to awk rather than blah blah blah).:

ps auxwww
    | grep $main_class
    | grep 10348
    | grep -v grep
    | grep -v ${awk_c}
    | ${awk_c} -v blah blah blah

This will ensure the list of processes will not containg any with the word awk in it.

Keep in mind that it's not always a good idea to do it this way (false positives) but, since you're already taking the risk with processes containing grep, you may as well do so with those containing awk as well.

paxdiablo
A: 

I've reformatted the code as code, but you need to learn that the return key is your friend. The monstrously long pipelines should be split over multiple lines - I typically use one line per command in the pipeline. You can also write awk scripts on more than one line. This makes your code more readable.

Then you need to explain to us what you are up to.

However, it is likely that you are using 'awk' as a variant on grep and are finding that the value 10348 (possibly intended as a port number on some command line) is also in the output of ps as one of the arguments to awk (as is the 'main_class' value), so you get the extra information. You'll need to revise the awk script to eliminate (ignore) the line that contains 'awk'.

Note that you could still be bamboozled by a command running your main class on port 9999 (any value other than 10348) if it so happens that it is run by a process with PID or PPID equal to 10348. If you're going to do the job thoroughly, then the 'awk' script needs to analyze only the 'command plus options' part of the line.

Jonathan Leffler
A: 

AWK can do all that grepping for you.

Here is a simple example of how an AWK command can be selective:

ps auxww | awk -v select="$mainclass" '$0 ~ select && /10348/ && ! (/grep/ || /awk/) && {print}'

ps can be made to selectively output fields which will help a little to reduce false positives. However pgrep may be more useful to you since all you're really using is the PID from the result.

pgrep -f "$mainclass.*10348"
Dennis Williamson