I'm no big shell scripter, some suggestions anyway...

* I think you might be missing an INSTANCE_HOME parameter here, something like

    # what we'd like but won't recognize instance home
    # exec /usr/bin/python $ZOPE_BASE/z2.py -z $ZOPE_BASE -u $USER \
    #     -w $HTTP_PORT -f $FTP_PORT -t $THREADS -Z $MANAGER \
    #     -l $INSTANCE_HOME$ZOPE_LOGFILE \
INSTANCE_HOME=$INSTANCE_HOME \
    #     -D "$@" $INSTANCE_HOME/var/startup.log &

or export the INSTANCE_HOME


* Are you shure you want to start Zope in debug mode?

* You might want to check http://zope.org/Documentation/Books/ZopeBook/2_6Edition/MaintainingZope.stx , I put some (very much simpler) startup scripts there

* Finally, the upcoming Zope 2.7 should behave much better wrt this (if thats any help to you :-))

- peter.


Sean Duffy wrote:
Hi,

These are probably more shell scripting issues, but I'm hoping that some scripter with an agile mind will show me the error of my ways, so here goes.

I have borrowed a script from the zope site and modified it for my
purposes, and it 'sort of' works.  The issues are:

Can't seem to get the Instance-Home stuff to work right without local
start scripts in each directory. Right below the $INSTANCE_HOME/start
is the line I'd like to use to simplify the management of the instances.

Can't get stop to work right. First 'stop' is not an instance, then the first instance does appear to get stopped, but it errors on the other two.

I get a 'start0' for the value of $WAIT in the starting text display.
(should just be a big fat zero or one!)

And for some reason, the script dumps the entire local environment to
the display before it does anything; any ideas why?

All constructive criticism welcome, and I'll take some flames (high of 22 today).

System is RedHat-9.0 Zope-2.6.2 Python-2.2.3

Zope is installed in /usr/local/zope
Instances are /var/zope-sites/

Here's the script:

#!/bin/sh

# /etc/init.d/zope-instances
#
# Starts or stops multiple instances of zope one by one or all at ones.
# Configuration is done all through one configuration file # /etc/zope-instances.conf which defines the location of the data-files,
# the user to run the instance, FTP portnrs, number of threads and if
the # zdaemon should be used (to start a new instance should the one crash) # all configurable per instance.
#
# Steps for creating and running a new instance:
# - start with a normal working (fresh) distribution of Zope
# ... snip ...
# - edit /etc/zope-instances.conf to run the new instance as you
desire
# - start the new instance (/etc/init.d/zope-instances start
instance-name)
#
# Note: this script is only tested for Red Hat distributions. # Locations of scripts may vary from various distributions. # Use at own risk.
#
# created: Chaim Zax (chaim at climbing.nl)
# version 0.02, dd. 29-3-'03
# version 0.02a, stuffduff 20-01-'04

INSTANCES_CONF="/etc/zope-instances.conf"
DEFAULT_USER="www-data"
ZOPE_BASE="/usr/local/zope" PS="ps wax"

# Log- and pid-files
ZDAEMON_PIDFILE="/var/zProcessManager.pid"
ZDAEMON_LOGFILE="/var/Z2_debug.log"
ZOPE_PIDFILE="/var/Z2.pid"
ZOPE_LOGFILE="/var/Z2.log"
ZOPE_DEBUGFILE="/var/zope-debug.log"

# Function for showing help-text how to use this script
helpText ()
{
echo "Starts or stops multiple instances of zope one by one or all at
ones."
echo
echo " zope-instance [start/stop/restart/info/kill] [instance-name]
[-w] [-h]"
echo
echo " start/stop : starts or stops one or all
zope-instances"
echo " restart : restarts one or all zope-
instances"
echo " info : gets instance info as well as their
current status"
echo " kill : kills one or all zope-instances,
even if orphaned"
echo " USE THIS ONLY WHEN ZOPE SPINS OUT
OF CONTROL"
echo " instance-name : if not provided or 'all' indicates
all instances,"
echo " else acts only on the given
instance"
echo " -w : Do not wait for instance to
startup"
echo " -h : This help-text"
}

startZope ()
{
  startingAndStopping "start" $1 $2
}

stopZope ()
{
  startingAndStopping "stop" $1 "-"
}

restartZope ()
{
  startingAndStopping "restart" $1 $2
}

infoZope ()
{
  startingAndStopping "info" $1 "-"
}

killZope ()
{
  if [[ $1 == "all" ]]; then
    killAll
  else
    killInstance $1
  fi
}

# Start one or more instances depending of $1 and $2
startingAndStopping ()
{
  MODE=$1  # mode is 'start', 'restart', 'stop' or 'info'
  INSTANCE=$2
  WAIT=$3

  if [ ! -e $INSTANCES_CONF ]; then
    echo "ERROR: No configuration file '$INSTANCES_CONF'"
    exit 1
  fi

  SETUP="no"
  # sift through the configuration file, one line at a time
  while read LINE; do
    if [[ ${LINE::1} != "#" ]]; then
      set $LINE

if [[ $1 != "" ]]; then
# starts, restarts or stops all instances (one per loop)
if [[ $INSTANCE == "all" ]]; then
STARTUP_MODE=$8
if [[ $STARTUP_MODE == 'start' || ($MODE != 'start' && $MODE
!= 'restart') ]]; then
actionOnInstance $MODE $1 $2 $3 $4 $5 $6 $7 $8 $WAIT
fi
SETUP="done"
# starts or stops only the provided instance and breaks out of
the loop
elif [[ $INSTANCE == $1 ]]; then
actionOnInstance $MODE $1 $2 $3 $4 $5 $6 $7 $8 $WAIT
SETUP="done"
break
fi
fi
fi
done < $INSTANCES_CONF

  # the instance-name doesn't correspond to the ones in the
configuration file
  if [[ $SETUP == "no" ]]; then
    echo "ZOPE-INSTANCE NOT STARTED/STOPPED! No instance found with
name'$INSTANCE'. Check the configuration file ($INSTANCES_CONF)."
    echo "Possible options are:"
    echo "- all (for starting and stopping all zope instances below)"
    cat $INSTANCES_CONF | awk '{ print "- " $1 }' | grep -v "#"
  fi
}

actionOnInstance () {
MODE=$1
INSTANCE_NAME=$2
WAIT=$10

  if [[ $MODE == "start" ]]; then
    startInstance $2 $3 $4 $5 $6 $7 $8 $9 $WAIT
  elif [[ $MODE == "restart" ]]; then
    stopInstance $2 $3 $4 $5 $6 $7 $8
    sleep 1
    startInstance $2 $3 $4 $5 $6 $7 $8 $9 $WAIT
  elif [[ $MODE == "stop" ]]; then
    stopInstance $2 $3 $4 $5 $6 $7 $8 $9
  elif [[ $MODE == "info" ]]; then
    infoOnInstance $2 $3 $4 $5 $6 $7 $8 $9
  else
    echo "Error: Unknown action on instance $1"
  fi
}

# with name, data directory, user, HTTP portnr, FTP portnr, number of
threads, manager
startInstance ()
{
  INSTANCE_NAME=$1
  INSTANCE_HOME=$2
  USER=$3
  HTTP_PORT=$4
  FTP_PORT=$5
  THREADS=$6
  USE_MANAGER=$7
  STARTUP_MODE=$8
  WAIT=$9

  # check for a running or starting instance, abort if found
  if [[ "`isHumming $INSTANCE_NAME`" = "yes" ]]; then
    if [ -e $INSTANCE_HOME$ZOPE_PIDFILE ]; then
      echo "Zope-instance '$INSTANCE_NAME' is already running."
    else
      echo "Zope-instance '$INSTANCE_NAME' is already being started."
    fi

else
# remove old pid files in case of a previous crash
rm -f $INSTANCE_HOME$ZDAEMON_PIDFILE
rm -f $INSTANCE_HOME$ZOPE_PIDFILE
echo "Starting Zope-instance: $INSTANCE_NAME..."
echo " data: '$INSTANCE_HOME', user: '$USER'"
echo " http: $HTTP_PORT, ftp: $FTP_PORT, threads: $THREADS,"
echo " use manager: $USE_MANAGER, default: $STARTUP_MODE, wait:
$WAIT"

# create the necessary startup parameters
if [[ $USER == "default" ]]; then
USER=$DEFAULT_USER
fi
if [[ $USE_MANAGER == "yes" ]]; then
MANAGER="1"
else
MANAGER="0"
fi
if [[ $ZOPE_DEBUGFILE != "" ]]; then
STUPID_LOG_FILE="$INSTANCE_HOME$ZOPE_DEBUGFILE"
Z_DEBUG_MODE=1
export STUPID_LOG_FILE Z_DEBUG_MODE
fi

    # what works
    $INSTANCE_HOME/start &

    # what we'd like but won't recognize instance home
    # exec /usr/bin/python $ZOPE_BASE/z2.py -z $ZOPE_BASE -u $USER \
    #     -w $HTTP_PORT -f $FTP_PORT -t $THREADS -Z $MANAGER \
    #     -l $INSTANCE_HOME$ZOPE_LOGFILE \
    #     -D "$@" $INSTANCE_HOME/var/startup.log &

    # wait for the instance to start up.
    WAIT="1"
    if [[ $WAIT == 1 ]]; then
      echo -n "     starting"
      waitForStartup $INSTANCE_NAME
    fi
    echo
  fi
}

stopInstance ()
{
  INSTANCE_NAME=$1
  INSTANCE_HOME=$2

  # check for a running or starting instance, abort if found
  if [[ "`isHumming $INSTANCE_NAME`" = "yes" ]]; then
    if [ ! -e $INSTANCE_HOME$ZOPE_PIDFILE ]; then
      echo "Zope-instance '$INSTANCE_NAME' is being started. Wait for it
to start up before stopping it, or kill ALL zope processes with the
'kill-all' option (not recommended)."
      echo
    else

# If we're running the zdaemon, kill it first to prevent it from # re-spawning a new zope-instance.
if [ -e $INSTANCE_HOME$ZDAEMON_PIDFILE ]; then
echo -n "Stopping ZDaemon for $INSTANCE_NAME... "
ZDAEMON_PID=`cat $INSTANCE_HOME$ZDAEMON_PIDFILE`
kill $ZDAEMON_PID 2/dev/null && true
echo "done"
fi

      # Kill the actual zope-instance
      if [ -e $INSTANCE_HOME$ZOPE_PIDFILE ]; then
        echo -n "Stopping Zope-instance: $INSTANCE_NAME... "
        ZOPE_PID=`cat $INSTANCE_HOME$ZOPE_PIDFILE | cut -d' ' -f2`
        kill $ZOPE_PID 2/dev/null && true
        echo "done"
      else
        echo "Zope-instance '$INSTANCE_NAME' was not running"
      fi

      cleanUp $INSTANCE_HOME
    fi

  else
    echo "Zope-instance '$INSTANCE_NAME' was not running"
    cleanUp $INSTANCE_HOME
  fi
}

# remove all floating pid and socket files
cleanUp () {
INSTANCE_HOME=$1

  # Do some cleaning up.
  if [ -e $INSTANCE_HOME$ZDAEMON_PIDFILE ]; then
    rm -f $INSTANCE_HOME$ZDAEMON_PIDFILE
  fi
  if [ -e $INSTANCE_HOME$ZOPE_PIDFILE ]; then
    rm -f $INSTANCE_HOME$ZOPE_PIDFILE
  fi

}

infoOnInstance ()
{
  INSTANCE_NAME=$1
  INSTANCE_HOME=$2
  USER=$3
  HTTP_PORT=$4
  FTP_PORT=$5
  THREADS=$6
  USE_MANAGER=$7
  STARTUP_MODE=$8
  WAIT=$9

  echo "Status of Zope-instance: $INSTANCE_NAME"
  echo "     data: '$INSTANCE_HOME', user: '$USER'"
  echo "     http: $HTTP_PORT, ftp: $FTP_PORT, threads: $THREADS,"
  echo "     use manager: $USE_MANAGER, default: $STARTUP_MODE, wait:
$WAIT"
  echo -n "     current status: "

  # check if an instance of z2.py is running with the correct
instance-name
  HUMMING=`isHumming $INSTANCE_NAME`

  # check for a running zdaeom with the correct pid
  if [ -e $INSTANCE_HOME$ZDAEMON_PIDFILE ]; then
    ZDAEMON_PID=`cat $INSTANCE_HOME$ZDAEMON_PIDFILE`

    if [[ "`ps wax | awk '{ print $1 }' | grep $ZDAEMON_PID`" != "" ]];
then
      ZDAEMON="running"
    else
      ZDAEMON="crashed"
    fi
  else
    ZDAEMON="off_or_starting"
  fi

  # check for a running zope with the correct pid
  if [ -e $INSTANCE_HOME$ZOPE_PIDFILE ]; then
    ZOPE_PID=`cat $INSTANCE_HOME$ZOPE_PIDFILE | cut -d' ' -f2`

    if [[ "`ps wax | awk '{ print $1 }' | grep $ZOPE_PID`" != "" ]];
then
      ZOPE="running"
    else
      ZOPE="crashed"
    fi
  else
    ZOPE="off_or_starting"
  fi

  # lets make sense of what we have found
  if [[ $ZOPE == "running" ]]; then
    if [[ $ZDAEMON == "running" ]]; then
      echo "RUNNING (ZDaemon running as well)"
    else
      echo "RUNNING (without ZDaemon)"
    fi
  elif [[ $ZOPE == "crashed" ]]; then
    if [[ $ZDAEMON == "running" ]]; then
      echo "RESTARTING after crash (if all is well)"
    else
      if [[ $HUMMING = "yes" ]]; then
        echo "CRASHED, but zope is still humming (sorry, i can't figure
it out)"
      else
        echo "CRASHED, AND NOT BEING RESTARTED (ZDaemon not running)"
      fi
    fi
  elif [[ $ZOPE == "off_or_starting" ]]; then
    if [[ $HUMMING = "yes" ]]; then
      echo "BEING STARTED"
    else
      echo "NOT RUNNING"
    fi
  else
    echo "ERROR IN SCRIPT (sorry)"
  fi

  echo
}

isHumming ()
{
  INSTANCE_NAME=$1
  HUMMING=`$PS | grep -v grep | grep "z2\.py.*$INSTANCE_NAME"`

  if [[ $HUMMING != "" ]]; then
    echo "yes"
  else
    echo "no"
  fi
}

waitForStartup () {
INSTANCE_NAME=$1
TIMEOUT=300

  while [[ $TIMEOUT 0 && "`isStarted $INSTANCE_NAME`" == "no" ]]; do
    sleep 1
    echo -n '.'
    TIMEOUT=`expr $TIMEOUT - 1`
  done

  if [[ "`isStarted $INSTANCE_NAME`" == "yes" ]]; then
    echo "done"
  else
    echo "FAILED"
  fi
}

isStarted () {
INSTANCE_NAME=$1

  if [ -e $INSTANCE_HOME$ZOPE_PIDFILE ]; then
    ZOPE_PID=`cat $INSTANCE_HOME$ZOPE_PIDFILE | cut -d' ' -f2`

    if [[ $ZOPE_PID != "" ]]; then
      echo "yes"
    else
      echo "no"
    fi
  else
    echo "no"
  fi
}

killAll () {
kill `ps wax | grep z2.py | grep -v grep | awk '{ print $1 }'`
}

killInstance ()
{
  INSTANCE_NAME=$1
  kill `$PS | grep -v grep | grep "z2\.py.*$INSTANCE_NAME" | awk '{
print $1 }'`
}

# --- main ----

if [[ $# 1 && $2 != "-w" ]]; then
  INSTANCE=$2
else
  INSTANCE="all"
fi

if [[ $2 == "-w" || $3 == "-w" ]]; then
WAIT=0
else
WAIT=1 fi

# these are our options...
case $1 in
  "start")
    startZope $INSTANCE $WAIT ;;
  "stop")
    stopZope $INSTANCE ;;
  "restart")
    restartZope $INSTANCE $WAIT ;;
  "info")
    infoZope $INSTANCE ;;
  "kill")
    killZope $INSTANCE ;;
  "-h")
    helpText
    exit 0 ;;
  *)
    echo "Unknown option '$1'"
    helpText
    exit 1

esac

And here's the conf:

# /etc/zope-instances.conf
#
# Configuration file to run zope with mulitple instances. This file is
used # with the /etc/init.d/zope-instances script to start and stop the zope # instances described below.
#
# name, data directory, user, http portnr, ftp portnr, number of
threads, manager, default

dev     /var/zope-sites/dev     zope    8082    8022    1  no   start
qat     /var/zope-sites/qat     zope    8081    -       2  no   start
prd     /var/zope-sites/prd     zope    8080    -       4  yes  start




_______________________________________________
Zope-Dev maillist - [EMAIL PROTECTED]
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )

Reply via email to