# chkconfig: 345 84 25
#
# description: Starts and stops the PostgreSQL backend daemon that handles \
-# all database requests.
+# all database requests.
#
# processname: postmaster
+cd /
+
# Source function library
. /etc/rc.d/init.d/functions
# Get network config
. /etc/sysconfig/network
+PG_INIT_LOCALE=C
+
# 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."
+ nls "Error: %s not found" /etc/sysconfig/postgresql
+ nls " 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."
+ nls "Error: PG_DB_CLUSTERS not found or is empty"
+ nls " PostgreSQL can't be run."
exit 1
fi
# Check that networking is up.
-if is_no "${NETWORKING}"; then
- msg_network_down PostgreSQL
- exit 1
+if is_yes "${NETWORKING}"; then
+ if [ ! -f /var/lock/subsys/network -a "$1" != stop -a "$1" != status -a "$1" != init ]; then
+ msg_network_down PostgreSQL
+ exit 1
+ fi
+else
+ exit 0
+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
#
pgstatus() {
PG_STATUS="unknown"
PG_PID="unknown"
- status=`/usr/bin/pg_ctl -D $1 status`
+ output=$(LC_ALL=C TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $1 status")
+ status=$?
- if echo "$status" | grep -q 'pg_ctl: postmaster or postgres is not running'; then
+ if [ $status -eq 3 ]; then
PG_STATUS="not running"
- elif echo "$status" | grep -q 'pg_ctl: postmaster is running'; then
+ elif [ $status -eq 0 ]; then
PG_STATUS="running"
- PG_PID=`echo "$status" | sed 's/^pg_ctl:.*pid: \([0-9]\+\).*/\1/' | head -1`
+ # or maybe grab it from postmaster.pid file?
+ PG_PID=$(echo "$output" | awk '/PID: / { match($0, "PID: [0-9]+"); print substr($0,RSTART+5,RLENGTH-5) }')
fi
}
# arguments:
# $1 - db cluster
#
-# sets variables:
-# PG_STARTED = 1 if instance has started up; please note, that function
-# will not set to other value
-#
pgstart() {
- msg_starting "PostgreSQL $1"
- busy
- TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -w -D $1 start 2>&1 >/dev/null"
-
- pgstatus "$1"
- if [ "$PG_STATUS" != "unknown" -a "$PG_PID" != "unknown" ]; then
- PG_STARTED=1
- deltext; ok
- else
- deltext; fail
- fi
+ is_no "$RC_LOGGING" && fork=--fork
+ msg_starting "PostgreSQL $1"
+ daemon $fork --user postgres /usr/bin/pg_ctl -s -w -D $1 start
}
-action="$1"
+#
+# 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
+}
-# any db cluster as command line argument?
-if [ $# -gt 1 ]; then
- shift
- DB_CLUSTERS="$@"
-else
- DB_CLUSTERS="$PG_DB_CLUSTERS"
-fi
+#
+# 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)
- PG_STARTED=0
- 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
+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 -p "$PG_PID" >/dev/null; then
+ msg_already_running "PostgreSQL $pgdir"
else
- pgstart "$pgdir"
- fi
- done
- # one of instances has started, so create the lock
- [ $PG_STARTED -eq 1 ] && touch /var/lock/subsys/postgresql
- ;;
- stop)
- for pgdir in $DB_CLUSTERS; do
- pgstatus "$pgdir"
- if [ "$PG_STATUS" = "not running" ]; then
+ # pg_ctl has misinformed us about postgresql status;
+ # remove pid file and run postgresql
msg_not_running "PostgreSQL $pgdir"
- else
- msg_stopping "PostgreSQL $pgdir"
- busy
+ rm -f $pgdir/postmaster.pid
+ pgstart "$pgdir"
+ fi
+ else
+ pgstart "$pgdir"
+ fi
+ done
+ pgsubsys
+}
- # 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
+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 -p "$PG_PID" >/dev/null; 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
+ fail
else
- # postgresql is not really alive; pg_ctl misinformed us
- # about the status
- deltext; died
+ ok
fi
-
- rm -f $pgdir/postmaster.pid
+ else
+ # postgresql is not really alive; pg_ctl misinformed us
+ # about the status
+ died
fi
- done
+ rm -f $pgdir/postmaster.pid
+ fi
+ done
+ pgsubsys
+}
+
+
+RETVAL=0
+# See how we were called.
+# Every action is performed for all given (all configured by default)
+# db clusters.
+case "$action" in
+ start)
+ start
;;
- status)
- for pgdir in $DB_CLUSTERS; do
- TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $pgdir status"
- done
+ stop)
+ stop
;;
- restart)
- $0 stop "$DB_CLUSTERS"
- $0 start "$DB_CLUSTERS"
+ status)
+ for pgdir in $DB_CLUSTERS; do
+ pgstatus "$pgdir"
+ if [ "$PG_STATUS" = "running" ]; then
+ show "PostgreSQL cluster %s, PID %s" "$pgdir" "$PG_PID"
+ progress "$PG_STATUS"
+ else
+ show "PostgreSQL cluster %s" "$pgdir"
+ progress "$PG_STATUS" "$CFAIL"
+ fi
+ echo
+ done
;;
- 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"
-
+ restart)
+ stop
+ start
+ ;;
+ reload|force-reload|try-restart)
+ if [ "$action" = "reload" ]; then
+ # "reload" must not restart service - so let it reload only what's possible
+ pgctlact="reload"
+ else
+ pgctlact="restart"
+ fi
+ for pgdir in $DB_CLUSTERS; do
+ pgstatus "$pgdir"
+ if [ "$PG_STATUS" = "not running" ]; then
+ msg_not_running "PostgreSQL $pgdir"
+ if [ "$action" != "try-restart" ]; then
+ RETVAL=7
+ fi
+ else
+ msg_reloading "PostgreSQL $pgdir"
+ busy
+ # is postgresql really alive?
+ if ps -p "$PG_PID" >/dev/null; then
+ TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $pgdir $pgctlact 2>&1 >/dev/null"
pgstatus "$pgdir"
- if [ "$PG_STATUS" = "running" ]; then
- deltext; ok
- else
- deltext; fail
- fi
+ if [ "$PG_STATUS" = "running" ]; then
+ ok
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"
+ fail
fi
+ elif [ "$action" != "try-restart" ]; then
+ # postgresql died and pg_ctl has misinformed us about
+ # the status - i.e. service is actually not running
+ RETVAL=7
+ 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
- done
+ fi
+ done
+ pgsubsys
;;
- *)
- msg_usage "$0 {start|stop|status|restart|reload}"
- exit 1
+ init)
+ nls "Note: this is only simple init action for convenience."
+ nls "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 $(nls "Skipping existing cluster %s" "$pgdir")
+ else
+ echo $(nls "Initializing cluster %s" "$pgdir")
+ mkdir -p $pgdir
+ chmod 700 $pgdir
+ chown postgres:postgres $pgdir
+ LC_ALL=$PG_INIT_LOCALE TMPDIR=/tmp su postgres -s /bin/sh -c "initdb -E UNICODE --data-checksums -D $pgdir"
+ fi
+ done
+ echo $(nls "REMEMBER to setup password for user \"postgres\"")'!'
+ ;;
+ *)
+ msg_usage "$0 {start|stop|init|restart|reload|force-reload|status}"
+ exit 3
esac
-exit 0
+exit $RETVAL