# Get network config
. /etc/sysconfig/network
+PG_INIT_LOCALE=C
+
# Get service config
if [ -f /etc/sysconfig/postgresql ]; then
. /etc/sysconfig/postgresql
output=$(LC_ALL=C TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $1 status")
status=$?
- if [ $status -eq 1 ]; then
+ if [ $status -eq 3 ]; then
PG_STATUS="not running"
elif [ $status -eq 0 ]; then
PG_STATUS="running"
- # or maybe grab it from postmaster.pid file?
- PG_PID=`echo "$output" | sed 's/^pg_ctl:.*PID: \([0-9]\+\).*/\1/' | head -n 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
}
# $1 - db cluster
#
pgstart() {
+ is_no "$RC_LOGGING" && fork=--fork
msg_starting "PostgreSQL $1"
- daemon --user postgres /usr/bin/pg_ctl -s -w -D $1 start
+ daemon $fork --user postgres /usr/bin/pg_ctl -s -w -D $1 start
}
#
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
+ if ps -p "$PG_PID" >/dev/null; then
msg_already_running "PostgreSQL $pgdir"
else
# pg_ctl has misinformed us about postgresql status;
msg_stopping "PostgreSQL $pgdir"
busy
# is postgresql really alive?
- if ps ax | grep -v grep | grep -q "$PG_PID"; then
+ 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
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
+ start
;;
stop)
- stop
+ stop
;;
status)
for pgdir in $DB_CLUSTERS; do
stop
start
;;
- reload|force-reload)
+ 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 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"
+ 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
ok
else
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
mkdir -p $pgdir
chmod 700 $pgdir
chown postgres:postgres $pgdir
- TMPDIR=/tmp su postgres -s /bin/sh -c "initdb -E UNICODE -D $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\"")'!'
exit 3
esac
-exit 0
+exit $RETVAL