[Zope-dev] Zope Start Script Woes
Peter Sabaini
peter at sabaini.at
Wed Jan 21 11:18:24 EST 2004
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 - Zope-Dev at zope.org
> 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 )
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3461 bytes
Desc: S/MIME Cryptographic Signature
Url : http://mail.zope.org/pipermail/zope-dev/attachments/20040121/5215975c/smime-0001.bin
More information about the Zope-Dev
mailing list