Shell 程序檔的第一行必須識別指令解譯程式。 資料服務範例中每個方法程序檔都識別指令解譯程式,如下所示:
#!/bin/ksh |
應用程式範例中的所有方法程序檔均匯出 Sun Cluster 二進位檔和程式庫的路徑,而不依賴使用者的 PATH 設定。
####################################################################### # MAIN ####################################################################### export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH |
所有方法程序檔 (Validate 除外) 均使用 pmfadm 來啟動 (或停止) 資料服務或監視器,並傳送資源的名稱。 每個程序檔都定義一個可傳送至 pmfadm 的變數 PMF_TAG, 以識別資料服務或監視器。
同樣,每個方法程序檔也都透過系統登錄使用 logger 指令來記錄訊息。 每個程序檔都定義一個可使用 -t 選項傳送至 logger 的變數 SYSLOG_TAG,以識別將為其記錄訊息的資源之資料類型、資源群組以及資源名稱。
所有方法都將以相同的方式定義 SYSLOG_TAG,如以下範例所示。 dns_probe、dns_svc_start、dns_svc_stop 和 dns_monitor_check 方法按如下所示定義 PMF_TAG (pmfadm 和 logger 的使用源自 dns_svc_stop 方法):
######################################################################### # 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 方法是使用其他引數 (呼叫 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}'` |