IBM Books

Group Services Programming Guide and Reference


The sample_deactive_ksh.sh deactivate script

#!/bin/ksh
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
#  
#  
# Licensed Materials - Property of IBM 
#  
# (C) COPYRIGHT International Business Machines Corp. 1997,2001 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
 
# @(#)62   1.4   src/rsct/pgs/samples/sample_deactive_ksh.sh, gssamples, rsct_r43x 5/14/01 09:43:49
 
#/*********************************************************************/
#/*
# * Name:  sample_deactive_ksh
# *
# * This module provides a simple sample deactivation program that can
# * be executed as part of an "expel" protocol against a provider,
# * or an "failure" protocol if the deactivate-on-failure is enabled.
# * It will expect the input parameters described as part of the
# * Expel Protocol and the Deactivate-On-Failure Handling description 
# * in the IBM PSSP Group Services Programming Guide and Reference manual.
# */
#/*********************************************************************/
#
#/*********************************************************************/
#/*
# * Expected input conditions:
# *  - effective uid and gid set to that of the client process connected
# *     to the Group Services daemon, at the time it issued ha_gs_init().
# *  - current directory matches that of the client process connected
# *     to the Group Services daemon, at the time it issued ha_gs_init().
# *  - path and other environment variables set to those used by the
# *     Group Services daemon.
# *
# * Expected input parameters:
# *  targetPid -- client process pid containing the provider targeted by the expel.
# *  timeLimit -- number of seconds within which this program must complete.
# *  groupName -- name of the group to which the targeted provider is joined.
# *  expelFlag -- flag specified by the provider initiating the expel.
# *                or "providerdied" as the deactivate-on-failure handling.
# *  failedProviders -- comma(,)-delimited list of the failed providers'
# *		local instance numbers. This parameter will be presented
# *		only for deactivate-on-failure handling.
# *
# *  Special conditions:
# *   targetPid == 0 -- the provider's process id already failed during the
# *                      expel protocol, or the deactivate-on-failure handling
# *                      is initiated.  Take any other necessary actions.
# *
# *   expelFlag == NULL -- no flag was specified.
# *              == "providerdied" -- the deactivate-on-failure handling 
# *                 is initiated.
# *
# * Output (exit code):
# *  0  -- means this program is "successful".  It is up to this program to
# *         define "successful".
# *  !0 -- means this program is "unsuccessful".  It is up to this program to
# *         define "unsuccessful".
# */
#/*********************************************************************/
#
#/*********************************************************************/
#/*
# * In the case of the expel protocol:
# * It is assumed that part of the normal action of a deactivate "script"
# * will be to "kill" the targeted provider's process, since if we are
# * running an expel we assume that the process is hung, or otherwise
# * misbehaving.
# *
# * For the deactivate-on-failure:
# * It will wait  until (timeLimit + 5) to exit. Exit with zero.
# *
# * However, this is optional.  This program should perform whatever
# * actions make sense for the group and its providers.
# */
#/*********************************************************************/
#
#/*********************************************************************/
#/*
# * For this sample program, we will use the *expel flag* as a key to
# * our behavior.
# *
# * Flag values:
# *  NULL  -- (no flag) No action, simply exit with 0 exit code.
# *  "kill" -- kill given process id (unless it is zero), exit with the
# *             return code from the kill command.
# *  "kill N" -- kill given process id (unless it is zero), exit with the
# *               value given by the integer N.
# *  "killwait" -- kill given process id (unless it is zero), but wait
# *                 to exit until (timeLimit + 5).  Always exit with zero.
# *  "wait" -- do not try to kill given process id, wait until
# *             (timeLimit + 5) to exit.  Always exit with zero.
# *  "wait N" -- do not try to kill given process id, wait until
# *               (timeLimit + 5) to exit.  N should be an integer, use it
# *               as our exit code.
# *  "N" -- N should be an integer, exit immediately with N as our exit
# *          code.
# *
# *  "providerdied" -- wait until (timeLimit + 5) to exit. Exit with zero.
# *			This indicates deactivate-on-failure.
# *
# */
#/*********************************************************************/
 
extraWait=5                     # Used to wait "extra" amount of time.
 
targetPid=$1                    # First three paramaters always there.
timeLimit=$2
groupName=$3
if ((4 <= $#))
then
  expelFlag=$4
else
  expelFlag=""
fi
 
# Check expel flag, and see what to do.
 
if [[ -z ${expelFlag} ]]
then
  exit 0                        # Null flag, just exit with zero exit code.
fi
 
if [[ $expelFlag = "killwait" ]]  # Try to kill target process, then wait.
then
  if ((0 != targetPid))
  then
    kill -9 $targetPid          # Kill the target process.
  fi
  ((sleepTime=timeLimit + extraWait))# Wait as long as specified.
  sleep $sleepTime
 
  exit 0
fi
 
# Kill the process?  If so, we may have a specific exit code that we
# should use, rather than the kill return code.
 
if [[ $expelFlag = "kill" ]]
then
  killRc=0
  if ((0 != targetPid))         # Have a pid?
  then
    kill -9 $targetPid          # Try to kill it.
    killRc=$?                   # Save return code.
  fi
  if [[ -z $5 ]]                # Was a flag given for exit code?
  then
    exit $killRc                # No, exit with kill return code.
  fi
  
  if ((0 == killRc))            # Good result from kill, use given code.
  then
    exit $5
  else
    exit $killRc                # Reflect results from kill.
  fi
fi
 
# No killing, but we need to wait for some amount of time before
# exiting.  If given, use specified value for exit code.
 
if [[ $expelFlag = "wait" ]]
then
  if [[ -z $5 ]]                  # Was a flag given for exit code?
  then
    ((sleepTime=timeLimit + extraWait))# Wait as long as specified.
    sleep $sleepTime
    exit 0                        # No special flag.
  else
    ((sleepTime=timeLimit + extraWait))# Wait as long as specified.
    sleep $sleepTime
    exit $5
  fi
fi
 
# In the case of the deactivate-on-failure:
# No killing, but we need to wait for some amount of time before
# exiting.  If given, use specified value for exit code.
 
if [[ $expelFlag = "providerdied" ]]
then
  failedProviders=$5	# holds the list of failed providers
  ((sleepTime=timeLimit + extraWait))# Wait as long as specified.
  sleep $sleepTime
  exit 0                        # No special flag.
fi
 
 
# Nothing else, simply exit with the given value.
 
exit $expelFlag
 


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]