Служба smf postgres solaris сообщает о состоянии в сети, прежде чем она сможет прослушивать соединения

У меня есть SMF-сервис (веб-сервер Naviserver), который зависит от того, чтобы postgres был запущен и работал (то есть принимал соединения) до его запуска. Postgres сообщает о своем статусе «в сети» задолго до того, как сможет принимать какие-либо соединения. Это приводит к тому, что веб-сервер не запускается должным образом. Насколько я могу судить, SMF сообщает онлайн, как только вызывается метод запуска postgres, вместо того, чтобы ждать какого-то статуса от 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 запущен из службы моего веб-сервера. Спасибо!

2
задан 26 March 2016 в 22:46
1 ответ

Согласно pg_ctl документации :

Synopsis

...

pg_ctl start [-w] [-t секунд ] [-s] [-D каталог данных] [-l имя файла] [-o параметры] [-p путь] [-c]

...

Параметры

...

-w

Дождитесь завершения запуска или завершения работы. Ожидание по умолчанию вариант для отключений, но не запусков. При ожидании запуска, pg_ctl неоднократно пытается подключиться к серверу. В ожидании shutdown, pg_ctl ждет, пока сервер удалит свой файл PID. pg_ctl возвращает код выхода в зависимости от успеха запуска или завершения работы.

-W

Не ждать завершения запуска или завершения работы. Это по умолчанию для режимов запуска и перезапуска.

...

Примеры

Запуск сервера

...

Чтобы запустить сервер, ожидая, пока сервер принимает соединения:

$ pg_ctl - w start

Поскольку команда $ PGBIN / pg_ctl -D $ PGDATA -l $ PGLOG start имеет неявную опцию -W , добавляя -w параметр команды в файле метода службы PostgrSQL должен делать то, что вы хотите, , пока служба вашего веб-сервера зависит от службы PostgreSQL :

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

Просто не забудьте проверить, изменился ли файл, если вы патч / обновление сервера.

0
ответ дан 3 December 2019 в 14:30

Теги

Похожие вопросы