Postgresql
postgres solaris smf 服務在偵聽連接之前線上報告狀態
我有一個 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
如果您修補/更新伺服器,請記住檢查文件是否被更改。