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(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 方法与其他参数(即,在其上调用该方法的资源和资源组的属性值)一起调用。有关更多信息,请参见处理属性更新。
每个回调方法都需要一个函数来解析传递该函数的参数。因为所有回调方法都传送相同的参数,所以数据服务提供了一个用于应用程序中所有回调方法的分析函数。
以下样例显示了样例应用程序中的回调方法所使用的 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}'`