Printing the Status of a Process in an Instance

Hi,

I am executing the command: "./opmnctl status" to get the status of the processes in the instance. There are totally 5 processes that are avaialble, out of which 3 are "Alive" and 2 are "Down". How can I use the IF loop to get the status and echo it??

For instance I want to run a check whether all the processes are "Alive" if yes then echo saying "OPMN is up" else "Not all OPMN processes are up"

Please help.

Thanks.

You can either just grep for the pattern you'd like not to find, in this case "Down" and test it's $? with if/then/fi to decide what to do.

Also to be more flexible you could do it like this:

root@isau02:/data/tmp/testfeld> cat infile
Alive process_one
Alive process_two
Down  process_three
Down  process_four
Alive process_five


awk '/^Alive/ {c+=1} END{if ( c != NR ) {print "not all processes are up"} else {print "all fine"} }' c=0 infile
not all processes are up

There are many ways to do this of course.

Thanks for your reply....
I am actually new to working with Unix...Could you please explain in detail??
Following is how im getting the process details:

[root@SNRBBY34844 bin]# ./opmnctl status
Processes in Instance: oc4j_as1.mxb01981s001.naretail.na.com
---------------------------------+--------------------+---------+-----
ias-component | process-type |pid | status
---------------------------------+--------------------+---------+-----
ASG | ASG |N/A | Down
OC4JGroup:default_group | OC4J:IP-BO-C-I~ |21242 |Alive
OC4JGroup:default_group | OC4J:P-BO-M10 |N/A | Down
OC4JGroup:default_group | OC4J:oc4j_soa |21240 | Alive
HTTP_Server | HTTP_Server |21239 | Alive

Thanks in advance. Appreciate your help...

If you post code, logs, data etc. use code-tags for better readability please.

Ok, processing the relevant part of your output:

awk -F"|" '
      $NF ~ /Alive/ {r+=1; a+=1; print}
      $NF ~ /Down/ {r+=1; d+=1; print}
END{if( a != r ) {print "some not up!"}}
' infile

ASG | ASG |N/A | Down
OC4JGroup:default_group | OC4J:IP-BO-C-I~ |21242 |Alive
OC4JGroup:default_group | OC4J:P-BO-M10 |N/A | Down
OC4JGroup:default_group | OC4Jc4j_soa |21240 | Alive
HTTP_Server | HTTP_Server |21239 | Alive
some not up!
  1. Setting | as field separator
  2. $NF is the last field, checking if it contains the pattern Alive
  3. If so, the stuff in the curly braces is being done, ie. it increases the record counter r by +1 and the Alive counter a by 1. With the record counter we track how many rows we processed over all.
  4. If it doesn't find the pattern "Alive" in the last field, it will use this line and check $NF for the pattern "Down". It increases the record counter by 1 and the Down counter d. The Down counter is not necessary but maybe for future use.
  5. In the end, when all lines are processed, it checkes the variables and if the Alive counter is not equal the number of processed relevant rows/records, it will spit an error message as you can see.

All other lines that don't fit to the 2 rules $NF ~ /Alive/ or $NF ~ /Down/ are just bypassed.

I am trying to execute the set of code u have provided by putting it in a script file for e.g. "Test.sh" and when I am executing the script I get a following error:

awk: cmd. line:2: -
awk: cmd. line:2: ^ unexpected newline or end of string

Can u pls. help?? Thanks in advance...

If you are on Solaris use /usr/xpg4/bin/awk. Else you might check if you have gawk or nawk.

I just checked the code again with gawk, no problem, works flawless.

I am on Linux machine...I tried using gawk but I get the same error...

gawk: cmd. line:2: -
gawk: cmd. line:2: ^ unexpected newline or end of string

Please suggest....

I just copied&pasted it to my putty:

root@isau02:/data/tmp/testfeld> cat infile
Processes in Instance: oc4j_as1.mxb01981s001.naretail.na.com
---------------------------------+--------------------+---------+-----
ias-component | process-type |pid | status
---------------------------------+--------------------+---------+-----
ASG | ASG |N/A | Down
OC4JGroup:default_group | OC4J:IP-BO-C-I~ |21242 |Alive
OC4JGroup:default_group | OC4J:P-BO-M10 |N/A | Down
OC4JGroup:default_group | OC4Jc4j_soa |21240 | Alive
HTTP_Server | HTTP_Server |21239 | Alive
root@isau02:/data/tmp/testfeld> cat mach.ksh
awk -F"|" '
      $NF ~ /Alive/ {r+=1; a+=1; print}
      $NF ~ /Down/ {r+=1; d+=1; print}
END{if( a != r ) {print "some not up!"}}
' infile
root@isau02:/data/tmp/testfeld> ./mach.ksh
ASG | ASG |N/A | Down
OC4JGroup:default_group | OC4J:IP-BO-C-I~ |21242 |Alive
OC4JGroup:default_group | OC4J:P-BO-M10 |N/A | Down
OC4JGroup:default_group | OC4Jc4j_soa |21240 | Alive
HTTP_Server | HTTP_Server |21239 | Alive
some not up!
root@isau02:/data/tmp/testfeld> awk --version
GNU Awk 3.1.5

Anyway, another way of many ways; maybe this works on your box:

FILE=infile; if [[ `grep -cE "Alive|Down" ${FILE}` != `grep -c Alive ${FILE}` ]]; then echo some not up; else echo all up; fi

Davinder,

Perhaps you can try the below code. Let me know if it works.

opmnctl status > /tmp/opmnctl_status.txt
 
while read line
do
  comp_name=`echo ${line} | awk '{print $1}'`
  comp_status=`echo ${line} | awk '{print $7}'`
  if [[ ${comp_status} = "Down" ]]; then
    printf "\n\n ${comp_name} is down. \n" >> /tmp/opmnctl_comp_status.txt
  elif [[ ${comp_status} = "Alive" ]]; then
    printf "\n\n ${comp_name} is up and running. \n" >> /tmp/opmnctl_comp_status.txt
  fi
done < /tmp/opmnctl_status.txt
 
cat /tmp/opmnctl_comp_status.txt
printf "\n\n"
 
rm -f /tmp/opmnctl_status.txt /tmp/opmnctl_comp_status.txt
 

HTH,:cool:

Regards,

Praveen