WPAR monitoring shell script suggestions needed

Hi All,

This is for WPAR monitoring shell script, earlier opened thread was closed, had to open a new thread, as suggested I have used script as below, But am trying to get the output in below format, need suggestions with it. Below is the lswpar output, required output format.

Script code:
lswpar | awk '
/^Name/ { next; }
/^---/ { next; }
{ state[$2] = state[$2] $1 " "; }
END {
printf( "==== WPAR Status Check =====\n" );
printf( "**** WPAR state Active:\n\t%s\n\n", state["A"] );
printf( "**** WPAR state Defined/Transition/broken:\n\t%s %s %s\n", state["D"], state["T"], state["B"] );
}
' | mail -s "WPAR `hostname` Server monitoring Status of Client WPARs" unix_support@xyz.com
Current Mail Output from script:
==== WPAR Status Check =====
**** WPAR state A-Active:
usprd02 usprd03 
**** WPAR state D-Defined/T-Transition/B-broken:
usprd04 usprd05 usprd06

Small changes to generate the total counts:

awk '
/^Name/ { next; }
/^---/ { next; }
{
    state[$2] = state[$2] $1 " ";
    if( $2 == "A" )
        acount++;
    else
        others++;
}
END {
printf( "==== WPAR Status Check =====\n" );
printf( "**** WPAR state Active:\n\t%s\n", state["A"] );
printf( "\t%d WPAR state A-Active\n\n", acount );
printf( "**** WPAR state Defined/Transition/broken:\n\t%s %s %s\n", state["D"], state["T"], state["B"] );
printf( "\t%d WPARs are in Defined/Transition/Broken state\n", others );
}
'

I assume the output from the mail you posted is correct (all were active), and that you're not suggesting that the script isn't putting out incorrect lists; you were only looking to have the additional count information added to the output.

1 Like

Thanks agama, you are the BEST

---------- Post updated at 11:35 AM ---------- Previous update was at 11:27 AM ----------

Hi agama,

I am trying to get the date included in the output, am i doing it correctly, need your suggestion.

awk '
/^Name/ { next; }
/^---/ { next; }
{
    state[$2] = state[$2] $1 " ";
    if( $2 == "A" )
        acount++;
    else
        others++;
}
END {
printf( "==== WPAR Status Check =====\n" );
printf( "==== `date` ====" );
printf( "**** WPAR state Active:\n\t%s\n", state["A"] );
printf( "\t%d WPAR state A-Active\n\n", acount );
printf( "**** WPAR state Defined/Transition/broken:\n\t%s %s %s\n", state["D"], state["T"], state["B"] );
printf( "\t%d WPARs are in Defined/Transition/Broken state\n", others );
}
'

Not quite the way to get date in. From inside of awk you cannot use backquotes like that. This is one way which should work with even older awks. I haven't used an AIX system since about 2001, and then only briefly, so I'm not sure what awk you have installed and what it supports.

 lpar-command | awk '
/^Name/ { next; }
/^---/ { next; }
{
    state[$2] = state[$2] $1 " ";
    if( $2 == "A" )
        acount++;
    else
        others++;
}
END {
printf( "==== WPAR Status Check =====\n" );
printf( "==== %s ====\n", date );
printf( "**** WPAR state Active:\n\t%s\n", state["A"] );
printf( "\t%d WPAR state A-Active\n\n", acount );
printf( "**** WPAR state Defined/Transition/broken:\n\t%s %s %s\n", state["D"], state["T"], state["B"] );
printf( "\t%d WPARs are in Defined/Transition/Broken state\n", others );
}
' date="$(date)" |mail-command

If $(date) doesn't work (I did assume you're using a modern kshell or bash) replace with `date` .

The way this works is to execute the date command in the shell, and supply that to awk as a variable. The original (or very early) awk specification allowed for variables to be defined like this after the programme, and before the list of input files (if any).

Hope this helps.

1 Like

works great.

Thanks.

1 Like

Hi agama,

Below script perfectly works, giving below mail output. I want to make the script mail only if there are any D-Defined/T-Transition/B-Broken State WPARs and also to copy the output generated during monitoring to a temporary log file, which gets cleaned up every week. Need your suggestions.

 lpar-command | awk '
/^Name/ { next; }
/^---/ { next; }
{
    state[$2] = state[$2] $1 " ";
    if( $2 == "A" )
        acount++;
    else
        others++;
}
END {
printf( "==== WPAR Status Check =====\n" );
printf( "==== %s ====\n", date );
printf( "**** WPAR state Active:\n\t%s\n", state["A"] );
printf( "\t%d WPAR state A-Active\n\n", acount );
printf( "**** WPAR state Defined/Transition/broken:\n\t%s %s %s\n", state["D"], state["T"], state["B"] );
printf( "\t%d WPARs are in D-Defined/T-Transition/B-Broken state\n", others );
}
' date="$(date)" |mail-command

Have a go with these small changes:

if !  lpar-command | awk '
/^Name/ { next; }
/^---/ { next; }
{
    state[$2] = state[$2] $1 " ";
    if( $2 == "A" )
        acount++;
    else
        others++;
}
END {
    printf( "==== WPAR Status Check =====\n" );
    printf( "==== %s ====\n", date );
    printf( "**** WPAR state Active:\n\t%s\n", state["A"] );
    printf( "\t%d WPAR state A-Active\n\n", acount );
    printf( "**** WPAR state Defined/Transition/broken:\n\t%s %s %s\n", state["D"], state["T"], state["B"] );
    printf( "\t%d WPARs are in Defined/Transition/Broken state\n", others );
    exit( others > 0 );
}
' date="$(date)"  >/tmp/mail_txt.$$
then
    mail command -s "subject" user@domain </tmp/mail.txt.$$
fi
cat /tmp/mail_txt.$$ >>/path/logfile
1 Like

works perfect...

Thanks.