proc_watch ()
{
# set -x # Uncomment to debug this function
# This function does all of the process monitoring!

while : # Loop Forever!!
do
    case $RUN in
    'Y')
        # This will run the startup_event_script, which is a function
        if [[ $RUN_STARTUP_EVENT = 'Y' ]]
        then
           echo "STARTUP EVENT: Executing Startup Event Script..."\
                 > $TTY
           echo "STARTUP EVENT: Executing Startup Event Script..."\
                  >> $LOGFILE

           startup_event_script # USER DEFINED FUNCTION!!!
           RC=$? # Check the Return Code!!
           if (( "RC" == 0 ))
           then
               echo "SUCCESS: Startup Event Script Completed RC -\
${RC}" > $TTY
               echo "SUCCESS: Startup Event Script Completed RC -\
${RC}" >> $LOGFILE

           else
               echo "FAILURE: Startup Event Script FAILED RC -\
${RC}" > $TTY
               echo "FAILURE: Startup Event Script FAILED RC -\
${RC}" >> $LOGFILE
           fi
        fi
        integer PROC_COUNT='-1' # Reset the Counters
        integer LAST_COUNT='-1'
        # Loop until the process(es) end(s)

        until (( "PROC_COUNT" == 0 ))
        do
           # This function is a Co-Process. $BREAK checks to see if
           # "Program Interrupt" has taken place. If so BREAK will
           # be 'Y' and we exit both the loop and function.

           read BREAK
           if [[ $BREAK = 'Y' ]]
           then
               return 3
           fi

           PROC_COUNT=$(ps aux | grep -v "grep $PROCESS" \
                        | grep -v $SCRIPT_NAME \
                        | grep $PROCESS | wc -l) >/dev/null 2>&1

           if (( "LAST_COUNT" > 0 && "LAST_COUNT" != "PROC_COUNT" ))
           then
               # The Process Count has Changed...
               TIMESTAMP=$(date +%D@%T)
               # Get a list of the PID of all of the processes
               PID_LIST=$(ps aux | grep -v "grep $PROCESS" \
                      | grep -v $SCRIPT_NAME \
                      | grep $PROCESS | awk '{print $2}')

               echo "PROCESS COUNT: $PROC_COUNT $PROCESS\
Processes Running ==> $TIMESTAMP" >> $LOGFILE &
               echo "PROCESS COUNT: $PROC_COUNT $PROCESS\
Processes Running ==> $TIMESTAMP" > $TTY
               echo ACTIVE PIDS: $PID_LIST >> $LOGFILE &
echo ACTIVE PIDS: $PID_LIST > $TTY
           fi
           LAST_COUNT=$PROC_COUNT
           sleep $INTERVAL # Needed to reduce CPU load!
        done

        RUN='N' # Turn the RUN Flag Off
        TIMESTAMP=$(date +%D@%T)
        echo "ENDING PROCESS: $PROCESS END time ==>\
$TIMESTAMP" >> $LOGFILE &
        echo "ENDING PROCESS: $PROCESS END time ==>\
$TIMESTAMP" > $TTY

        # This will run the post_event_script, which is a function

        if [[ $RUN_POST_EVENT = 'Y' ]]
        then
            echo "POST EVENT: Executing Post Event Script..."\
                  > $TTY
            echo "POST EVENT: Executing Post Event Script..."\
                  >> $LOGFILE &

            post_event_script # USER DEFINED FUNCTION!!!
            integer RC=$?
            if (( "RC" == 0 ))
            then
                echo "SUCCESS: Post Event Script Completed RC -\
${RC}" > $TTY
                echo "SUCCESS: Post Event Script Completed RC -\
${RC}" >> $LOGFILE
            else
                echo "FAILURE: Post Event Script FAILED RC - ${RC}"\
                      > $TTY
                echo "FAILURE: Post Event Script FAILED RC - ${RC}"\
                      >> $LOGFILE
            fi
       fi
       ;;

   'N')
       # This will run the pre_event_script, which is a function

       if [[ $RUN_PRE_EVENT = 'Y' ]]
       then
          echo "PRE EVENT: Executing Pre Event Script..." > $TTY
          echo "PRE EVENT: Executing Pre Event Script..." >> $LOGFILE

          pre_event_script # USER DEFINED FUNCTION!!!
          RC=$? # Check the Return Code!!!
          if (( "RC" == 0 ))
          then
              echo "SUCCESS: Pre Event Script Completed RC - ${RC}"\
                    > $TTY
              echo "SUCCESS: Pre Event Script Completed RC - ${RC}"\
                    >> $LOGFILE
          else
              echo "FAILURE: Pre Event Script FAILED RC - ${RC}"\
                    > $TTY
              echo "FAILURE: Pre Event Script FAILED RC - ${RC}"\
                    >> $LOGFILE
          fi
       fi

       echo "WAITING: Waiting for $PROCESS to \
startup...Monitoring..."

       integer PROC_COUNT='-1' # Initialize to a fake value

       # Loop until at least one process starts

       until (( "PROC_COUNT" > 0 ))
       do
           # This is a Co-Process. This checks to see if a "Program
           # Interrupt" has taken place. If so BREAK will be 'Y' and
           # we exit both the loop and function

           read BREAK
           if [[ $BREAK = 'Y' ]]
           then
               return 3
           fi

           PROC_COUNT=$(ps aux | grep -v "grep $PROCESS" \
                        | grep -v $SCRIPT_NAME | grep $PROCESS | wc -l) \
                          >/dev/null 2>&1

           sleep $INTERVAL # Needed to reduce CPU load!
       done

       RUN='Y' # Turn the RUN Flag On

       TIMESTAMP=$(date +%D@%T)

       PID_LIST=$(ps aux | grep -v "grep $PROCESS" \
                  | grep -v $SCRIPT_NAME \
                  | grep $PROCESS | awk '{print $2}')

       if (( "PROC_COUNT" == 1 ))
       then
           echo "START PROCESS: $PROCESS START time ==>\
$TIMESTAMP" >> $LOGFILE &
           echo ACTIVE PIDS: $PID_LIST >> $LOGFILE &
           echo "START PROCESS: $PROCESS START time ==>\
$TIMESTAMP" > $TTY
           echo ACTIVE PIDS: $PID_LIST > $TTY
       elif (( "PROC_COUNT" > 1 ))
       then
           echo "START PROCESS: $PROC_COUNT $PROCESS\
Processes Started: START time ==> $TIMESTAMP" >> $LOGFILE &
           echo ACTIVE PIDS: $PID_LIST >> $LOGFILE &
           echo "START PROCESS: $PROC_COUNT $PROCESS\
Processes Started: START time ==> $TIMESTAMP" > $TTY
           echo ACTIVE PIDS: $PID_LIST > $TTY
       fi
       ;;
    esac
done
}

