应用部署为Solaris 10 SMF服务( 四 )


有关milestone的概念请参看Solaris Service Management Facility - Quickstart Guide 。
6. manifest文件必须定义启动和停止服务的方法,标签即用于此目的 。原先利用/etc/init.d/myapp.sh加合适的参数即可启动和停止myapp,现仍可利用 。不过myapp.sh需作小小改动,改动方法请参看下节启停方法客户化 。对于启动和停止,分别需要定义两个method,它们的type当然都为“method,其中一个name设为为“start,exec表示执行什么动作以完成这个start方法,其动作设为“/export/home/smfdemo/myapp.sh start 。另一个name设为“stop,由于原脚本是使用pkill命令杀掉myapp进程,所以这里可以直接将“:kill赋给exec,表示SMF可直接杀掉myapp服务相关的所有进程 。timeout_seconds定义了完成启动和停止服务操作所需的最长时间,如果在这个时间内未能完成相应操作,SMF会认为服务存在问题,因为会将服务置为maintenance状态,由人工进行排错 。本例中,timeout_seconds设为60秒足矣 。
事实上还有许多标签项目可以设定,但对于本例不是必要的,所以可省略不设 。有关manifest文件编写更详细信息,请参看Solaris Service Management Facility - Service Developer Introduction 。
启停方法客户化 SMF框架中svcs(1)命令非常有用,它不但可以列出系统中所有的服务资源及状态,还可以提供那些未正常启动的服务的出错原因、影响范围和可能的恢复方法等 。比如,它可以报告说某个服务因为配置不正确而未正常启动,或者某服务遇到致使错误请参SMF的某个日志文件等 。SMF之所以能够提供这些信息是由于启动和停止方法提供了相关的信息 。SMF要求所有启动和停止方法必须返回一组特定的值,具体值可以参看Solaris 10操作系统/lib/svc/share/smf_include.sh文件尾部 。
本例中,表2所示的/etc/init.d/myapp.sh可能返回3种值,$CONFIG_ERROR、$FATAL_ERROR和$RUN_OK 。现目标是要替换原返回值为相应的SMF返回值,如果没有相应的SMF返回值,则替换为最合适的SMF返回值,使服务非正常退出时,SMF能够报告可令人接受的错误原因 。本例修改方法如下:
1. 首先,将表2所示的/etc/init.d/myapp.sh文件拷贝到开发目录下,比如/export/home/smfdemo目录下 。后面步骤中所有修改都改在拷贝内 。
2. 通过增加“. /lib/svc/share/smf_include.sh到myapp.sh头部,将SMF所需的各返回变量和过程包含到myapp.sh脚本 。
3. 替换“exit $CONFIG_ERROR为“exit $SMF_EXIT_ERR_CONFIG,因为$SMF_EXIT_ERR_CONFIG与原退出码$CONFIG_ERROR退出原因最相近 。
4. 替换“exit $FATAL_ERROR为“exit $SMF_EXIT_ERR_FATAL,因为$SMF_EXIT_ERR_FATAL与原退出码$FATAL_ERROR退出原因最相近 。
5. 替换“exit $RUN_OK为“exit $SMF_EXIT_OK,因为$SMF_EXIT_OK与原退出码$RUN_OK退出原因最相近 。
6. 删除stop case及其操作 。因为stop方法已在myapp.xml中另行处理,不再需要myapp.sh了 。
7. 修改default case中的echo,以反映正确的usage 。
修改后的myapp.sh如表4所示 。至此,所有前期准备工作都已完成,下面就可以进行部署了 。
表4. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #!/sbin/sh
###############################################################################
# /export/home/smfdemo/myapp.sh #
###############################################################################
. /lib/svc/share/smf_include.sh
RUN_OK=0
CONFIG_ERROR=1
FATAL_ERROR=2
case "$1" in
'start')
/export/home/hunter/smf/myapp_smf
if [ $? -eq $CONFIG_ERROR ]; then

推荐阅读