[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: SYSV initscript for slapd (ITS#548)



Thanks!  I didn't see this anywhere in the tarball, hence my basic
submission.  I am developing my slapd database initially on Solaris, so
you're right - killall is bad (killall - kill all active processes) in
this world.

Below is some hackery I just did, based on the Portable Shell
Programming book -- it's about as portable I can get it, but I don't
have access to all platforms.  I've been able to test in on Linux,
Solaris, BSD (3), and SGI.  Help with AIX, HP, Ultrix, and DECOSF
appreciated.

== begin systype() and kprocs() functions, for portable "killall" ==

# systype and kprocs hacked from original functions in Portable
# Shell Programming:
# "The code in this file is from the book "Shell Programming
# Examples" by Bruce Blinn, published by Prentice Hall.
# This file may be copied free of charge for personal,
# non-commercial use provided that this notice appears in
# all copies of the file.  There is no warranty, either
# expressed or implied, supplied with this code."

# Determine an OS type
systype() {
 _HOSTNAME=`hostname | sed 's/\..*//'`
  case `uname -s` in
    AIX )          echo AIX              ;;
    BSD/OS )       echo BSD              ;;
    HP-UX )        echo HP               ;;
    IRIX )         echo SGI              ;;
    Linux )        echo LINUX            ;;
    OSF1 )         echo DECOSF           ;;
    ULTRIX )       echo ULTRIX           ;;
    SunOS )        case `uname -r` in
                     4*)  echo SUNBSD    ;;
                     5*)  echo SOLARIS   ;;
                   esac
                   ;;
    $_HOSTNAME )   case `uname -m` in
                     IP*)      echo SGI  ;;
                     i386)     echo SCO  ;;
                   esac
                   ;;
  esac
}

# Kill all named processes
kprocs() {
  OLD_IFS=$IFS              # Original value of IFS variable
  PROCESS_LIST=/tmp/list.$$ # Output of ps command
  SYSTEM=`systype`          # System type
  trap 'rm -f /tmp/*.$$; exit 1' 1 2 3 15
  # Get and check the command line parameters.
  SIGNAL=                   # Optional signal; see kill(1)
  case $1 in
    --)  shift
         ;;
    -*)  SIGNAL=$1          # Leave the hyphen
         shift
         ;;
  esac
  if [ $# -ne 1 ]; then
    echo "$USAGE" 1>&2
    exit 1
  fi
  NAME=$1        # Get the name of the process to kill.
  # Determine which options to use with the ps command.
  PS_OPTS=                  # Options for ps command
  case $SYSTEM in
    SUNBSD | ULTRIX ) PS_OPTS="-auxw"  ;;
    BSD )             PS_OPTS="-auw"   ;;
    * )               PS_OPTS="-ef"    ;;
  esac
  # Get a list of the current processes and filter out the
  # lines that do not contain the process we are looking for.
  ps $PS_OPTS             |
    sed '1d'              |  # Remove the title line
    grep -- "$NAME"       |  # Eliminate the chaff
    grep -v "$0"          |  # Eliminate this process
    grep -v "ps $PS_OPTS" >$PROCESS_LIST
  # Check each process.
  exec <$PROCESS_LIST
  IFS=
  while read LINE
  do
    IFS=$OLD_IFS
    # Get the owner, PID, and name of the process.
    set $LINE
    OWNER=$1
    PID=$2
    # Determine the column where the process name begins.
    COL=                      # Column where process name begins
    case $SYSTEM in
      AIX | HP | LINUX | SGI | SOLARIS )  COL=48 ;;
      SUNBSD | DECOSF )                   COL=57 ;;
      ULTRIX )                            COL=51 ;;
      BSD )                               COL=65 ;;
      * ) echo "Unexpected system type." 1>&2
          exit 1
          ;;
    esac
    LINE=`echo "$LINE" | cut -c$COL-`
    set dummy $LINE
    shift
    PROCNAME=$1
    if [ "$PROCNAME" = "$NAME" -o \
	    "`basename -- $PROCNAME`" = "$NAME" ]; then
      kill $SIGNAL $PID
    fi
    IFS=
  done
  rm -f /tmp/*.$$
}

== end systype() and kprocs() funtions ==


Ben Collins wrote:
> 
> You might want to try this one, which is a modified version of the Debian
> GNU/Linux script. Note, "killall" is not very portable outside of the
> Linux expected usage, so change that for outside of this. The special
> thing about this version is that it will start slurpd if there are any
> replicas defined.

-- 
Troy Engel, Systems Engineer
F L U I D - [http://www.fluid.com]