開始する前にpostgresが稼働している(つまり接続を受け入れる)ことに依存するSMFサービス(Naviserver Webサーバー)があります。 Postgresは、実際に接続を受け入れることができるかなり前に、そのステータスを「オンライン」として報告します。これにより、Webサーバーが正しく起動できなくなります。私が知る限り、SMFは、postgresからのある種のステータスが準備ができていることを示すのを待つのではなく、postgresstartメソッドが呼び出されるとすぐにオンラインでレポートします。
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が実際にWebサーバーサービスから開始されていることを確認するにはどうすればよいですか。ありがとう!
あらすじ
.。
pg_ctl start [-w] [-t seconds] [-s] [-D datadir] [-l filename] [-o options] [-p path] [-c]
.。
オプション
.。
-w
起動またはシャットダウンが完了するのを待ちます。待機はシャットダウンのデフォルトオプションですが、スタートアップではありません。起動を待つ間、pg_ctlはサーバーへの接続を繰り返し試行します。シャットダウンを待機している場合、pg_ctlはサーバーがPIDファイルを削除するのを待機します。 pg_ctlは、起動またはシャットダウンの成功に基づいて終了コードを返します。
-W
起動またはシャットダウンが完了するのを待たないでください。これは、開始モードと再起動モードのデフォルトです。
.。
例
サーバーの起動
.。
サーバーを起動するには、サーバーが接続を受け入れるまで待機します。
$ pg_ctl -w start
$PGBIN/pg_ctl -D $PGDATA -l $PGLOG start
コマンドには暗黙の-W
オプションがあるため、PostgrSQLサービスメソッドファイルのコマンドに-w
オプションを追加すると、必要な処理を実行できます。 WebサーバーサービスはPostgreSQLサービスに依存しているため:
$PGBIN/pg_ctl -D $PGDATA -l $PGLOG -w start
サーバーにパッチを適用/更新する場合は、ファイルが変更されているかどうかを確認することを忘れないでください。