Postgresql

postgres solaris smf 服務在偵聽連接之前線上報告狀態

  • March 27, 2016

我有一個 SMF 服務(Naviserver Web 伺服器),它依賴於 postgres 在啟動之前啟動並執行(即接受連接)。Postgres 在實際能夠接受任何連接之前就將其狀態報告為“線上”。這會導致 Web 伺服器無法正常啟動。據我所知,一旦呼叫 postgres start 方法,SMF 就會線上報告,而不是等待來自 postgres 的某種狀態表明它已準備好。

SMF 清單:

<?xml version=1.0?>
<!DOCTYPE service_bundle SYSTEM /usr/share/lib/xml/dtd/service_bundle.dtd.1>
<service_bundle type=manifest name=export>
  <service name=application/database/postgresql_945 type=service version=0>
    <dependency name=network grouping=require_all restart_on=none type=service>
      <service_fmri value=svc:/milestone/network:default/>
    </dependency>
    <dependency name=filesystem-local grouping=require_all restart_on=none type=service>
      <service_fmri value=svc:/system/filesystem/local:default/>
    </dependency>
    <exec_method name=start type=method exec=/lib/svc/method/postgres_945 start timeout_seconds=60/>
    <exec_method name=stop type=method exec=/lib/svc/method/postgres_945 stop timeout_seconds=60/>
    <exec_method name=refresh type=method exec=/lib/svc/method/postgres_945 refresh timeout_seconds=60/>
    <property_group name=general type=framework>
      <propval name=action_authorization type=astring value=solaris.smf.manage.postgres/>
      <propval name=value_authorization type=astring value=solaris.smf.value.postgres/>
    </property_group>
    <instance name=default_64bit enabled=true>
      <method_context>
        <method_credential group=postgres user=postgres/>
      </method_context>
      <property_group name=postgresql_945 type=application>
        <propval name=bin type=astring value=/usr/postgres/9.4.5/bin/>
        <propval name=data type=astring value=/var/postgres-94/data/>
        <propval name=log type=astring value=/var/postgres-94/logs/server.log/>
        <propval name=value_authorization type=astring value=solaris.smf.value.postgres/>
      </property_group>
    </instance>
    <stability value=Evolving/>
    <template>
      <common_name>
        <loctext xml:lang=C>PostgreSQL RDBMS version postgresql_945</loctext>
      </common_name>
      <documentation>
        <manpage title=postgresql_945 section=5/>
        <doc_link name=postgresql.org uri=http://postgresql.org/>
      </documentation>
    </template>
  </service>
</service_bundle>

方法文件:

#!/sbin/sh
#
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
#ident     @(#)postgresql_945      1.1     08/04/30 SMI

. /lib/svc/share/smf_include.sh

# SMF_FMRI is the name of the target service. This allows multiple instances
# to use the same script.

getproparg() {
        val=`svcprop -p $1 $SMF_FMRI`
        [ -n $val ] && echo $val
}

check_data_dir() {
   if [ ! -d $PGDATA ]; then
           echo Error: postgresql_945/data directory $PGDATA does not exist
           exit $SMF_EXIT_ERR_CONFIG
   fi

   if [ ! -w $PGDATA ]; then
           echo Error: postgresql_945/data directory $PGDATA is not writable by postgres
           exit $SMF_EXIT_ERR_CONFIG
   fi

   if [ ! -d $PGDATA/base -o ! -d $PGDATA/global -o ! -f $PGDATA/PG_VERSION ]; then
           # If the directory is empty we can create the database files
           # on behalf of the user using initdb
           if [ `ls -a $PGDATA | wc -w` -le 2 ]; then
                   echo Notice: postgresql_945/data directory $PGDATA is empty
                   echo Calling '$PGBIN/initdb -D $PGDATA' to initialize

                   $PGBIN/initdb -D $PGDATA
                   if [ $? -ne 0 ]; then
                           echo Error: initdb failed
                           exit $SMF_EXIT_ERR
                   fi
           else
                   echo Error: postgresql_945/data directory $PGDATA is not empty, nor is it a valid PostgreSQL data directory
                   exit $SMF_EXIT_ERR_CONFIG
           fi
   fi
}

PGBIN=`getproparg postgresql_945/bin`
PGDATA=`getproparg postgresql_945/data`
PGLOG=`getproparg postgresql_945/log`

if [ -z $SMF_FMRI ]; then
   echo Error: SMF framework variables are not initialized
   exit $SMF_EXIT_ERR
fi

if [ -z $PGDATA ]; then
        echo Error: postgresql_945/data property not set
        exit $SMF_EXIT_ERR_CONFIG
fi

if [ -z $PGLOG ]; then
        echo Error: postgresql_945/log property not set
        exit $SMF_EXIT_ERR_CONFIG
fi


case $1 in
start)
   check_data_dir
        $PGBIN/pg_ctl -D $PGDATA -l $PGLOG start
        ;;

stop)
        $PGBIN/pg_ctl -D $PGDATA stop -m fast
        ;;

refresh)
        $PGBIN/pg_ctl -D $PGDATA reload -m fast
        ;;

*)
        echo Usage: $0 {start|stop|refresh}
        exit 1
        ;;

esac
exit $SMF_EXIT_OK

我可以做些什麼來確保 postgres 在接受連接之前不會報告為線上,或者檢查 postgres 是否實際上已從我的網路伺服器服務啟動。謝謝!

根據pg_ctl文件

概要

pg_ctl start [-w] [-t seconds] [-s] [-D datadir] [-l filename] [-o options] [-p path] [-c]

選項

-在

等待啟動或關閉完成。等待是關機的預設選項,但不是啟動。等待啟動時,pg_ctl 反复嘗試連接伺服器。等待關閉時,pg_ctl 等待伺服器刪除其 PID 文件。pg_ctl 根據啟動或關閉的成功返回一個退出程式碼。

-在

不要等待啟動或關閉完成。這是啟動和重新啟動模式的預設設置。

例子

啟動伺服器

要啟動伺服器,等待伺服器接受連接:

$ pg_ctl -w start

由於該$PGBIN/pg_ctl -D $PGDATA -l $PGLOG start命令具有隱式-W選項,因此只要您的 Web 伺服器服務依賴於 PostgreSQL 服務-w,將選項添加到 PostgrSQL 服務方法文件中的命令應該可以滿足您的要求:

$PGBIN/pg_ctl -D $PGDATA -l $PGLOG -w start

如果您修補/更新伺服器,請記住檢查文件是否被更改。

引用自:https://serverfault.com/questions/766269