X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=postgresql.init;h=647f2ec4328af6cab69cf80b305ae8a7c25863b1;hb=adfd9c7ffbbb26a7219309c31b40913339fb5ca3;hp=3aa428b0c5a27d06671a53e8b1a29ab3fb04049b;hpb=80883d779ea3797575177589cabe47051bc21ad0;p=packages%2Fpostgresql.git diff --git a/postgresql.init b/postgresql.init index 3aa428b..647f2ec 100644 --- a/postgresql.init +++ b/postgresql.init @@ -18,6 +18,8 @@ cd / # Get network config . /etc/sysconfig/network +PG_INIT_LOCALE=C + # Get service config if [ -f /etc/sysconfig/postgresql ]; then . /etc/sysconfig/postgresql @@ -71,15 +73,15 @@ fi pgstatus() { PG_STATUS="unknown" PG_PID="unknown" - output=`LC_ALL=C TMPDIR=/tmp su postgres -c "/usr/bin/pg_ctl -D $1 status"` - status=`echo $?` + 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 -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 } @@ -90,8 +92,9 @@ pgstatus() { # $1 - db cluster # pgstart() { + is_no "$RC_LOGGING" && fork=--fork msg_starting "PostgreSQL $1" - daemon --user postgres /usr/bin/pg_ctl -s -D $1 start + daemon $fork --user postgres /usr/bin/pg_ctl -s -w -D $1 start } # @@ -114,18 +117,13 @@ pgsubsys() { # 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) +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 + if ps -p "$PG_PID" >/dev/null; then msg_already_running "PostgreSQL $pgdir" else # pg_ctl has misinformed us about postgresql status; @@ -139,8 +137,9 @@ case "$action" in fi done pgsubsys - ;; - stop) +} + +stop() { for pgdir in $DB_CLUSTERS; do pgstatus "$pgdir" if [ "$PG_STATUS" = "not running" ]; then @@ -148,8 +147,8 @@ case "$action" in else msg_stopping "PostgreSQL $pgdir" busy - # is postgresql really alive? - if ps ax | grep -v grep | grep -q "$PG_PID"; then + # 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 @@ -166,6 +165,19 @@ case "$action" in 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 + ;; + stop) + stop ;; status) for pgdir in $DB_CLUSTERS; do @@ -181,26 +193,39 @@ case "$action" in done ;; restart) - $0 stop "$DB_CLUSTERS" - $0 start "$DB_CLUSTERS" + 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 @@ -224,7 +249,7 @@ case "$action" in 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\"")'!' @@ -234,4 +259,4 @@ case "$action" in exit 3 esac -exit 0 +exit $RETVAL