#!/bin/sh # # postgresql This is the init script for starting up the PostgreSQL # server # # chkconfig: 345 84 25 # # description: Starts and stops the PostgreSQL backend daemon that handles \ # all database requests. # # processname: postmaster # Source function library . /etc/rc.d/init.d/functions # Get network config . /etc/sysconfig/network # Get service config if [ -f /etc/sysconfig/postgresql ]; then . /etc/sysconfig/postgresql else echo "Error: /etc/sysconfig/postgresql not found" echo " PostgreSQL can't be run." exit 1 fi if [ ! "$PG_DB_CLUSTERS" ]; then echo "Error: PG_DB_CLUSTERS not found or is empty" echo " PostgreSQL can't be run." exit 1 fi # Check that networking is up. if is_no "${NETWORKING}"; then msg_network_down PostgreSQL exit 1 fi action="$1" # any db cluster as command line argument? if [ $# -gt 1 ]; then shift # perform action for specified clusters only DB_CLUSTERS="$@" else DB_CLUSTERS="$PG_DB_CLUSTERS" fi # # Useful functions. # # # check for postgresql status # # arguments: # $1 - db cluster # # sets variables: # PG_STATUS = running | not running # PG_PID = pid of postmaster process # pgstatus() { PG_STATUS="unknown" PG_PID="unknown" status=`/usr/bin/pg_ctl -D $1 status` if echo "$status" | grep -q 'pg_ctl: postmaster or postgres is not running'; then PG_STATUS="not running" elif echo "$status" | grep -q 'pg_ctl: postmaster is running'; then PG_STATUS="running" PG_PID=`echo "$status" | sed 's/^pg_ctl:.*pid: \([0-9]\+\).*/\1/' | head -1` fi } # # start postgresql and display appropriate messages # # arguments: # $1 - db cluster # pgstart() { msg_starting "PostgreSQL $1" busy TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -w -D $1 start 2>&1 >/dev/null" sleep 1 pgstatus "$1" if [ "$PG_STATUS" != "unknown" -a "$PG_PID" != "unknown" ]; then deltext; ok else deltext; fail fi } # # check for running postgresql instances; if any instance is running then # create subsys lock file # pgsubsys() { # check for every defined db cluster in sysconfig file for pgdir in $PG_DB_CLUSTERS; do pgstatus "$pgdir" if [ "$PG_STATUS" = "running" ]; then touch /var/lock/subsys/postgresql return fi done rm -f /var/lock/subsys/postgresql } # # End of useful functions. # # See how we were called. # Every action is performed for all given (all configured by default) # db clusters. case "$action" in start) for pgdir in $DB_CLUSTERS; do pgstatus "$pgdir" if [ "$PG_STATUS" = "running" ]; then # pg_ctl status can misinform us about postgresql status # so let's check if postmaster is really alive if ps ax | grep -v grep | grep -q "$PG_PID"; then msg_already_running "PostgreSQL $pgdir" else # pg_ctl has misinformed us about postgresql status; # remove pid file and run postgresql msg_not_running "PostgreSQL $pgdir" rm -f $pgdir/postmaster.pid pgstart "$pgdir" fi else pgstart "$pgdir" fi done pgsubsys ;; stop) for pgdir in $DB_CLUSTERS; do pgstatus "$pgdir" if [ "$PG_STATUS" = "not running" ]; then msg_not_running "PostgreSQL $pgdir" else msg_stopping "PostgreSQL $pgdir" busy # is postgresql really alive? if ps ax | grep -v grep | grep -q "$PG_PID"; then TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -w -D $pgdir stop -m fast 2>&1 >/dev/null" pgstatus "$pgdir" if [ "$PG_STATUS" != "not running" ]; then deltext; fail else deltext; ok fi else # postgresql is not really alive; pg_ctl misinformed us # about the status deltext; died fi rm -f $pgdir/postmaster.pid fi done pgsubsys ;; status) for pgdir in $DB_CLUSTERS; do TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $pgdir status" done ;; restart) $0 stop "$DB_CLUSTERS" $0 start "$DB_CLUSTERS" ;; reload) for pgdir in $DB_CLUSTERS; do pgstatus "$pgdir" if [ "$PG_STATUS" = "not running" ]; then msg_not_running "PostgreSQL $pgdir" else msg_reloading "PostgreSQL $pgdir" busy # is postgresql really alive? if ps ax | grep -v grep | grep -q "$PG_PID"; then TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $pgdir restart 2>&1 >/dev/null" pgstatus "$pgdir" if [ "$PG_STATUS" = "running" ]; then deltext; ok else deltext; fail fi else # postgresql died and pg_ctl has misinformed us about # the status; remove pid file and start it again deltext; died rm -f $pgdir/postmaster.pid pgstart "$pgdir" fi fi done pgsubsys ;; init) echo "Note: this is only simple init action for convenience." echo "If you want some non-standard options, consider using initdb(1)." echo for pgdir in $DB_CLUSTERS; do if [ -f $pgdir/PG_VERSION ]; then echo "Skipping existing cluster $pgdir" else echo "Initializing cluster $pgdir" TMPDIR=/tmp su - postgres -s /bin/sh -c "initdb -D $pgdir" fi done echo "REMEMBER to setup password for user \"postgres\"!" ;; *) msg_usage "$0 {start|stop|status|restart|reload}" exit 1 esac exit 0