[Zope] My custom scripts for starting/stopping multiple Zope instances

Jim Cain jec@mgmt-inc.com
Tue, 1 Feb 2000 15:11:04 -0500 (EST)


All,

There have been some questions on here recently on how to start and stop
Zope. The system I've created may not be the fanciest, but it works for
me.

It all begins with the standard SysV script in /etc/rc.d/init.d, which
calls zstart and zstop as appropriate. This is fairly standard, and I
won't bore you with the contents of my script here.

zstart and zstop both read configuration files in /etc/zope.d/*, which
currently contains two files: env and instances. The env file is sourced
to redefine defaults that are set in zstart and zstop. The instances file
describes how to start z2.py. I run ZServer on Red Hat 6.0 from behind
Apache.

Here is env:

---begin---
# /etc/zope.d/env
#
# Set environment variables that differ from default

ZOPE_USER=www
ZOPE_BASE=/usr/local/Zope
---end---

Here is instances:

---begin---
# /etc/zope.d/instances
#
# instance_name ftp_port n_threads use_manager
#
polonius	8022	2	0
gertrude	8023	2	1
---end---

Here is zstart:

---start---
#!/bin/bash

#
# Set default environment
#

ENV_FILE=/etc/zope.d/env
INSTANCES_FILE=/etc/zope.d/instances
ZOPE_USER=nobody
ZOPE_BASE=/opt/Zope
CGIBIN_BASE=/home/httpd/cgi-bin
INSTANCE_BASE=/home/httpd/zope
PS="ps wax"
PYTHON=/usr/local/bin/python

#
# process command line options
#

while getopts "c:" opt
do
	case "$opt" in
		i)	if [ -r "$OPTARG" ]
			then
				INSTANCES_FILE=$OPTARG
			else
				echo "$0: cannot read $OPTARG"
				exit 1
			fi
			;;

		e)	if [ -r "$OPTARG" ]
			then
				ENV_FILE=$OPTARG
			else
				echo "$0: cannot read $OPTARG"
				exit 1
			fi
			;;

		?)	echo "Usage: $0 [-i instances-file] [-e environment-file]"
			exit 3
			;;
	esac
done

#
# Read environment file
#

. "$ENV_FILE"

#
# is_running instance_name
#

is_running ()
{
	if $PS | grep -v grep | grep "z2\.py.*$1" > /dev/null 2>&1
	then
		echo yes
	else
		echo no
	fi
}

#
# start_instance instance_name ftp_port n_threads use_manager
#

start_instance ()
{
	if [ "$4" = "0" ]
	then
		manager=
	else
		manager="-Z $INSTANCE_BASE/$1/manager.pid"
	fi

	su $ZOPE_USER -c \
		"$PYTHON $ZOPE_BASE/z2.py \
		-p $CGIBIN_BASE/$1/Zope.cgi \
		-w '' -m '' -f $2 -t $3 $manager\
		INSTANCE_HOME=$INSTANCE_BASE/$1 \
		>> $INSTANCE_BASE/$1/z2.log 2>&1 &"
}


###############################################################################
#
# Main program
#

awk 'substr($1, 0, 1) != "#" {print $0}' $INSTANCES_FILE | (
while read line; do
	set $line
	if [ "`is_running $1`" = "yes" ]
	then
		echo "$0: Warning: instance $1 already running"
	else
		start_instance $1 $2 $3 $4
	fi
done)
---end---

Here is zstop:

---begin---
#!/bin/bash

#
# Set default environment
#

ENV_FILE=/etc/zope.d/env
INSTANCES_FILE=/etc/zope.d/instances
ZOPE_USER=nobody
ZOPE_BASE=/usr/local/Zope
CGIBIN_BASE=/home/httpd/cgi-bin
INSTANCE_BASE=/home/httpd/zope
PS="ps wax"
PYTHON=/usr/local/bin/python

#
# process command line options
#

while getopts "c:" opt
do
	case "$opt" in
		i)	if [ -r "$OPTARG" ]
			then
				INSTANCES_FILE=$OPTARG
			else
				echo "$0: cannot read $OPTARG"
				exit 1
			fi
			;;

		e)	if [ -r "$OPTARG" ]
			then
				ENV_FILE=$OPTARG
			else
				echo "$0: cannot read $OPTARG"
				exit 1
			fi
			;;

		?)	echo "Usage: $0 [-i instances-file] [-e environment-file]"
			exit 3
			;;
	esac
done

#
# Read environment file
#

. "$ENV_FILE"

#
# stop_instance instance_name use_manager
#

stop_instance ()
{
	if [ "$2" = "0" ]
	then
		pidfile=pcgi.pid
	else
		pidfile=manager.pid
	fi

	kill `cat "$INSTANCE_BASE/$1/var/Z2.pid"` # > /dev/null 2>&1
}


###############################################################################
#
# Main program
#

awk 'substr($1, 0, 1) != "#" {print $0}' $INSTANCES_FILE | (
while read line; do
	set $line
	stop_instance $1
done)
---end---


Hope some people find this helpful. If it's helpful enough, maybe I'll
submit it as a HOWTO on Zope.org.

Cheers,
Jim