Init scripts for pg_autovacuum - Mailing list pgsql-admin

From Marc Gimpel
Subject Init scripts for pg_autovacuum
Date
Msg-id 4288C013.9090609@horizonwimba.com
Whole thread Raw
List pgsql-admin
    Hi

    I've improved the pg_autovacuum SysV init script so that it can work
stand alone (place it in /etc/rc.d/init.d/autovacuum and use chkconfig
to turn it on or off) or it can also work with the postgresql init script.
    Someone may like to consider putting it into CVS.
    Here is the autovacuum init script:

**********************************************************************

#!/bin/sh
# autovacuum    This is the init script for starting up the PostgreSQL
#               server AutoVacuum daemon.
#
# chkconfig: - 95 05
# description: Starts and stops the PostgreSQL AutoVacuum daemon.
# processname: pg_autovacuum
# pidfile: /var/run/pg_autovacuum.${PGPORT}.pid
#
# Version 0.9 Marc Gimpel <marc@gimpel.org>
# Based on script by Theo Galanakis 11/04/2005
# Based on postgresql init script

# Source function library.
INITD=/etc/rc.d/init.d
. $INITD/functions

# Name of database application
PGNAME=postgresql

# Set defaults for configuration variables
PGENGINE=/usr/bin
PGPORT=5432
PGAV_SLEEP=600

# Override defaults from /etc/sysconfig/pgsql if file is present
[ -f /etc/sysconfig/pgsql/${PGNAME} ] && . /etc/sysconfig/pgsql/${PGNAME}

# Initialize pg_autovacuum defaults
if [ -z "$PGAV_LOGFILE" ]; then
     PGAV_LOGFILE=/var/log/pg_autovacuum.{$PGPORT}.log
fi

script_result=0

startautovacuum() {
         # Start pg_autovacuum. Theo Galanakis 11/05/2005
         # Note : ensure $PGENGINE is being used in script otherwise
hardcode to /usr/bin/
         if [ -f /var/run/pg_autovacuum.${PGPORT}.pid ]
         then
                 echo $"pg_autovacuum already running."
         else
                 PGAV_START=$"Starting pg_autovacuum service: "
                 echo -n "$PGAV_START"
                 pg_autovacuum -D -s ${PGAV_SLEEP} -p ${PGPORT} -U
postgres -L ${PGAV_LOGFILE} ${PGAV_OPTS}
                 sleep 1
                 pg_autovacuum_pid=`pidof -s $PGENGINE/pg_autovacuum`
                 if [ $pg_autovacuum_pid ]
                 then
                    success "$PGAV_START"
                    echo $pg_autovacuum_pid >
/var/run/pg_autovacuum.${PGPORT}.pid
                    echo
                 else
                    failure "$PGAV_START"
                    echo
                    script_result=1
                 fi
         fi
}

stopautovacuum () {
         # Stop pg_autovacuum.
         if [ -f /var/run/pg_autovacuum.${PGPORT}.pid ]
         then
                 pg_autovacuum_pid=`head -n 1
/var/run/pg_autovacuum.${PGPORT}.pid`
                 ret=`ps --no-heading ${pg_autovacuum_pid}`
                 if [ -z "$ret" ]
                 then
                         echo $"pg_autovacuum: pid
[${pg_autovacuum_pid}] stored in /var/run/pg_autovacuum.${PGPORT}.pid
does not exist."

                 else
                         echo -n $"Stopping pg_autovacuum service: "

                         kill -TERM $pg_autovacuum_pid
                         ret=`ps --no-heading ${pg_autovacuum_pid}`
                         if [ -z "$ret" ]
                         then
                                 echo_success
                         else
                                 echo_failure
                                 script_result=1
                         fi
                         echo
                         rm -f /var/run/pg_autovacuum.${PGPORT}.pid
                 fi
         else
                 echo $"pg_autovacuum is not running."
         fi
}

statusautovacuum() {
         # Status pg_autovacuum.
         if [ -f /var/run/pg_autovacuum.${PGPORT}.pid ]
         then
                 pg_autovacuum_pid=`head -n 1
/var/run/pg_autovacuum.${PGPORT}.pid`
                 ret=`ps --no-heading ${pg_autovacuum_pid}`
                 if [ -z "$ret" ]
                 then
                         echo $"pg_autovacuum not running..."
                 else
                         echo $"pg_autovacuum (pid ${pg_autovacuum_pid})
is running..."
                 fi
         else
                 status pg_autovacuum
         fi
}

restartautovacuum() {
         stopautovacuum
         startautovacuum
}

case "$1" in
   start)
         startautovacuum
         ;;
   stop)
         stopautovacuum
         ;;
   status)
         statusautovacuum
         ;;
   restart)
         restartautovacuum
         ;;
   *)
         echo $"Usage: $0 {start|stop|status|restart}"
         exit 1
esac

exit $script_result

**********************************************************************

To use the script with the postgresql init script just slightly modify
it as follows:

**********************************************************************

case "$1" in
   start)
         start
         if [ -f "$INITD/autovacuum" ] && [ "$PGAV_ENABLED" = "yes" ]; then
           $INITD/autovacuum start
         fi
         ;;
   stop)
         stop
         if [ -f "$INITD/autovacuum" ] && [ "$PGAV_ENABLED" = "yes" ]; then
           $INITD/autovacuum stop
         fi
         ;;
   status)
         status postmaster
         script_result=$?
         if [ -f "$INITD/autovacuum" ] && [ "$PGAV_ENABLED" = "yes" ]; then
           $INITD/autovacuum status
         fi
         ;;
   restart)
         restart
         if [ -f "$INITD/autovacuum" ] && [ "$PGAV_ENABLED" = "yes" ]; then
           $INITD/autovacuum restart
         fi
         ;;
   condrestart)
         condrestart
         ;;
   condstop)
         condstop
         ;;
   reload|force-reload)
         reload
         ;;
   *)
         echo $"Usage: $0
{start|stop|status|restart|condrestart|condstop|reload|force-reload}"
         exit 1
esac

**********************************************************************

Note that if the autovacuum script is not found there will be no error
so it is safe to commit these changes in CVS too.

Finally you just need to add the following line to
/etc/sysconfig/pgsql/postgresql to enable autovacuuming.

PGAV_ENABLED=yes

So none of the changes will affect peoples current setups unless they
explicitely chose to.

I hope this helps people.

Marc

--
--------------------------------------------------------------------------
Marc Gimpel
Director of Research

HORIZON WIMBA - REACH BEYOND THE CLASSROOM
Espace Beethoven, bat 2B, 1200 Route des Lucioles
06560 Sophia Antipolis, France
Tel. + 33 (0)4 92 00 45 85
Fax + 33 (0)4 92 00 45 81
Mob + 33 (0)6 74 88 02 72
mgimpel@horizonwimba.com

www.horizonwimba.com
--------------------------------------------------------------------------




pgsql-admin by date:

Previous
From: Adam M
Date:
Subject: Cannot verify signature of win32 8.0.3 distribution.
Next
From: Jags
Date:
Subject: problems after upgrading to 7.4.5