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


'stop')
/usr/bin/pkill myapp
*)
echo "Usage: $0 { start | stop }"
esac
exit $RUN_OKSMF可部署的服务
本节讲述如何将上述例子改为SMF可部署的服务 。根据SMF的要求,开发一个SMF可部署的服务需要至少以下几个步骤 。
创建manifest文件
SMF manifest文件是一个XML文件,它用以定义SMF服务各属性 。比如,定义服务名称、服务依赖关系、服务启动方法、服务停止方法、服务所需参数等 。创建manifest文件最简单的方法是从/var/svc/manifest目录下挑选已存在的相同类型的服务XML文件,将它拷贝到开发目录,比如/export/home/smfdemo目录下,以拷贝件为基础修改而成 。本文是个简单的服务,所以参考了 /var/svc/manifest/system/utmp.xml文件(因为它也很简单),在其基础上修改成表3所示的/export/home/smfdemo/myapp.xml 。
表3. 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
29
30
31
32
33
34
35
36
37


name='application/myapp'
type='service'
version='1'>

name='milestone'
grouping='require_all'
restart_on='none'
type='service'>

type='method'
name='start'
exec='/export/home/smfdemo/myapp.sh start'
timeout_seconds='60' />
type='method'
name='stop'
exec=':kill'
timeout_seconds='60' />

myapp.xml必须符合/usr/share/lib/xml/dtd/service_bundle.dtd.1规范,其意理解如下:
1. 标签用以告知SMF如何处理myapp.xml文件 。本例中myapp.xml是一个manifest文件用以定义SMF服务,所以type赋为“manifest 。同时需要给service_bundle一个名字,一般命名规范是以服务所在安装包名为前缀,所以本例将name赋为“mypackage:myapp 。其实name只要不与系统中已有的相重就可以了,当然对于企业级应用服务应该有一个合适的名字 。
2. 标签主要定义SMF服务的名称,由于myapp只是一个简单应用,所以name赋为“application/myapp 。如果myapp是网络服务,则根据命名规范名字应以“network/开头加myapp,即 “network/myapp,请参考/var/svc/manifest/下的目录结构以此类推 。type当然应赋为“service 。至于version,根据情况设定,缺省取1 。
3. 根据需要SMF服务可以为同一个服务启动多个实例(instance) 。比如,在系统中同一种数据库平台可以启动多个服务实例,分别服务于不同的应用;或者同一种WEB服务平台启动多个服务实例,在不同的端口提供不同WEB应用服务等 。在SMF框架中只需定义一个SMF service及属性,在同一个service下定义不同的instance和特定属性即可 。service下已定义的属性适用于所有instance,但任何一个instance也可以根据需要特定某个或某几个属性 。比如增加属性或覆盖service同名属性定义 。由于本例非常简单,只需一个服务一个实例就行了,所以采用标签,所有属性全部采用service中的属性即可 。
4. 由于希望myapp服务在系统boot时自动启动,所以将标签中enable置为“true 。
5. 是manifest文件中最难定义的部分,它定义了此服务所依赖的其他资源,包括服务、文件系统等 。一个SMF服务根据需要可以定义多个,每个具有自己的标识名name、grouping、 restart_on、type,以及所依赖的各资源的service_fmri 。其中name只是个标识,不相重有意义即可 。grouping取值定义了所列其他服务与本资源的依存关系,取值“require_all是指当所列其他资源全部启动和可用后才能满足本服务启动的要求 。restart_on 规定了当所依赖的其他资源发生何种情况时需要重启本服务,取值“none是指只要本服务处于运行状态就行了,不必考虑所依赖的其他资源的状态是否改变 。type指向依赖资源的类型,比如“service指服务,“path指文件系统等 。service_fmri指其他服务的FMRI(Fault Management Resource IdengifIEr) 。本例仅需在/tmp目录下生成日志文件,而“milestone/multi-user所指的运行状态完全可以满足要求,所以 service_fmri设为“svc:/milestone/multi-user 。

推荐阅读