Shell 程序檔的第一行必須識別指令解譯程式。資料服務範例中的每個方法程序檔識別指令解譯器,如下所示︰
#!/bin/ksh
應用程式範例中的所有方法程序檔將路徑匯出至 Sun Cluster 二進位檔和程式庫,而非依據使用者的 PATH 設定。
####################################################################### # MAIN ####################################################################### export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH
所有方法程序檔 (Validate 除外) 均使用 pmfadm 啟動或停止資料服務或監視器,同時傳送資源名稱。每個程序檔均會定義變數 PMF_TAG,該變數可以被傳送至 pmfadm 以識別是資料服務還是監視器。
同樣地,每個方法程序檔均使用 logger 指令在系統記錄檔中記錄訊息。每個程序檔均定義變數 SYSLOG_TAG,可以透過 -t 選項將該變數傳送至 logger,以識別記錄訊息的資源之資源類型、資源名稱以及資源群組。
所有方法以相同方式定義 SYSLOG_TAG,如以下程式碼範例所示。dns_probe、dns_svc_start、dns_svc_stop 和 dns_monitor_check 方法如下定義 PMF_TAG (使用 dns_svc_stop 方法的 pmfadm 和 logger)。
######################################################################### # MAIN ######################################################################### PMF_TAG=$RESOURCE_NAME.named SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # Send a SIGTERM signal to the data service and wait for 80% of the # total timeout value. pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.info \ -t [$SYSLOG_TAG] \ “${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with \ SIGKILL”
dns_monitor_start、dns_monitor_stop 和 dns_update 方法如下定義 PMF_TAG (使用的 pmfadm 來自 dns_monitor_stop 方法)︰
##################################################################### # MAIN ##################################################################### PMF_TAG=$RESOURCE_NAME.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME ... # See if the monitor is running, and if so, kill it. if pmfadm -q $PMF_TAG.monitor; then pmfadm -s $PMF_TAG.monitor KILL
RGM 執行所有回呼方法 (Validate 除外),如下所示︰
method-name -R resource-name -T resource-type-name -G resource-group-name
方法名稱是實施回呼方法的程式之路徑名稱。資料服務為 RTR 檔案中的每個方法指定路徑名稱。這些路徑名稱與由 RT_basedir 特性指定的目錄相對,也位於 RTR 檔案。例如,在資料服務範例的 RTR 檔案中,基底目錄和方法名稱指定如下︰
RT_basedir=/opt/SUNWsample/bin; Start = dns_svc_start; Stop = dns_svc_stop; ...
所有回呼方法引數將作為已標幟的值傳送。-R 引數表示資源實例的名稱。-T 引數表示資源類型。-G 引數表示將資源配置到的群組。請參閱 rt_callbacks(1HA) 線上手冊,以取得有關回呼方法的更多資訊。
將使用附加引數 (即呼叫方法時所在的資源和資源群組之特性值) 呼叫 Validate 方法。請參閱處理特性更新,以取得更多資訊。
每個回呼方法均需要一個函數來剖析傳送函數的引數。由於傳送給所有回呼相同的引數,因此資料服務提供一個單一剖析函數,該函數用於應用程式內的所有回呼中。
以下範例顯示在應用程式範例中用於回呼方法的 parse_args() 函數。
######################################################################### # Parse program arguments. # function parse_args # [args ...] { typeset opt while getopts 'R:G:T:' opt do case "$opt" in R) # Name of the DNS resource. RESOURCE_NAME=$OPTARG ;; G) # Name of the resource group in which the resource is # configured. RESOURCEGROUP_NAME=$OPTARG ;; T) # Name of the resource type. RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ "ERROR: Option $OPTARG unknown" exit 1 ;; esac done }
儘管應用程式範例中的 PROBE 方法是使用者定義的方法 (而不是 Sun Cluster 回呼方法),但是也可透過與回呼方法使用相同的引數來呼叫。因此,該方法含有與其他回呼方法所使用的剖析函數相同的剖析函數。
該剖析函數在 MAIN 中稱為:
parse_args “$@”
回呼方法應該使用 syslog() 函數將錯誤訊息輸出至一般使用者。資料服務範例中的所有回呼方法均使用 scha_cluster_get 指令擷取用於叢集記錄檔的 syslog() 函數之編號,如下所示︰
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`
該值儲存於 shell 變數 SYSLOG_FACILITY 中,可以用做 logger 指令來在叢集記錄檔中記錄訊息。例如,資料服務範例中的 Start 方法擷取 syslog() 函數並記錄資料服務已啟動的訊息,如下所示︰
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` ... if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG] \ "${ARGV0} HA-DNS successfully started" fi
請參閱 scha_cluster_get(1HA) 線上手冊,以取得更多資訊。
大多數回呼方法需要獲取有關資料服務之資源與資源類型特性的資訊。API 將為此目的提供 scha_resource_get() 函數。
系統定義的特性和延伸特性均可用。系統定義的特性是預先定義的。您可以定義 RTR 檔案中的延伸特性。
當您使用 scha_resource_get() 獲取系統定義的特性值時,您可以透過 -O 選項指定特性名稱。指令將僅傳回特性的值。例如,在資料服務範例中,Monitor_start 方法需要找到探測程式,這樣才能啟動該程式。探測程式位於資料服務的基底目錄中,RT_basedir 特性指向該基底目錄。Monitor_start 方法擷取 RT_basedir 的值並將其放入 RT_BASEDIR 變數,如下所示︰
RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \ $RESOURCEGROUP_NAME`
對於延伸特性,您必須使用 -O 選項指定某一特性為延伸特性。您還必須提供特性名稱作為最後一個引數。對於延伸特性,指令將傳回特性的類型和值。例如,在資料服務範例中,探測程式擷取 Probe_timeout 延伸特性的類型和值,並使用 awk 指令將該值僅放入 PROBE_TIMEOUT shell 變數中,如下所示︰
probe_timeout_info=`scha_resource_get -O Extension \ -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME Probe_timeout` PROBE_TIMEOUT=`echo $probe_timeout_info | awk '{print $2}'`