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 如下所示(使用的是 dns_monitor_stop 方法中的 pmfadm):
######################################################################### # 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}'` |