網絡依然還是計算機,Sun還是Sun!

应用部署为Solaris 10 SMF服务

上一篇 / 下一篇  2007-09-28 15:21:29 / 个人分类:Solaris10专题

IXPUB技术博客y8f&On} [

SMF功能概览IXPUB技术博客,Glr.t/t7|6B1@#|

IXPUB技术博客?,oy T'jgb

Solaris 10中的SMF提供了强大的服务管理功能。以下是一部分重要的功能:

9\A1Wes0IXPUB技术博客L`Z[!oDB7E,?'j d

1. SMF向系统管理员提供统一的服务管理平台,利用svcs(1)命令就可以查看SMF所辖的各种服务,利用svccfg(1M)和svcadm(1M)命令可以配置各种服务和管理各种服务。对于传统UNIX,系统管理员必须记住各种服务不同的启动/停止方法、配置修改方法、服务状态及日志查询方法而言, SMF统一管理平台极大地降低了系统管理的难度,也降低了系统管理出错的机率。

zoz;zM#}0IXPUB技术博客0m!Q"xb,Ey5T

2. SMF提供各服务间的依赖关系设定,可以自动按依赖关系顺序启动各服务。这对于传统UNIX以rc脚本文件名排列先后决定启动/停止顺序而言,SMF提供了无可比拟的完善的管理能力。IXPUB技术博客M1M[{9JX

4R+g3lr'Gx,kP U03. 并行启动不相互依赖的服务,从而使系统启动更快。由于各服务的依赖关系在SMF中有明确的定义,所以不相干的服务完全可以并行启动而不必担心冲突。

!z!}cqU0IXPUB技术博客:f?2mN TjXrk

4. 自动侦测所辖服务的运行状态,在必要时可以重启服务或停止服务。作为预测性自愈技术(Predictive Self-Healing)的组成部分,SMF可以对所辖服务进行状态监控。根据服务的需要,SMF可以在服务进程不存在时,自动重启服务,或者在服务所依赖关系发生问题时,重启服务。也可以在服务连续发生问题时,将服务置为维护(maintenance)状态。

%r&?_o5S~ i0

2E%P%B!h0H0当然,SMF的管理机制并不排斥传统rc脚本运行服务的机制,以最大程度兼容传统方式的运作。有关SMF更多的介绍,请参看Solaris Service Management Facility - Quickstart GuideIXPUB技术博客,K {(N4G.\;k9~_ _:E!qG

r$]]&P#vD f/]0一个简单的服务程序IXPUB技术博客w.K%uQ;}0S2ow:X#g

*O f |-V4LL3Rj2@0<表1是一个简单的程序myapp.c,它运行后将成为后台守护进程存在于系统中,并每间隔5秒钟向日志文件/tmp/myapp.log插入一行记录以报告自己的存在。虽然它实际上不向外提供任何服务,但该程序模拟了一般服务程序的设计结构和运行模式。即,程序运行后以守护进程形式存在于系统,程序头部有模拟服务配置read_config()和初始化app_init()逻辑,中部使用sleep(5)模拟等待服务请求逻辑,通过向日志插入记录模拟服务请求处理逻辑,然后返回至循环开始处sleep(5)继续等待下一个服务请求等。只要在此结构上修改和扩充相应的逻辑就可以将此程序修改为一个真正的服务程序。本文要点是说明如何部署应用为SMF服务,所以仅采用此程序作为例子。

#]2S"S kw c0
表1.IXPUB技术博客/h:Ef N-N3]+_ T
1IXPUB技术博客+|u(Ku7M6k5c g-z-S
2
_ G7qkbN1E03IXPUB技术博客Q2aD4W&q ag9}fT
4
gl5pg'S{05IXPUB技术博客-?4gMt n}&g
6IXPUB技术博客j$ds oB9Z"^
7
3Y x(oY:xT08
z'@M3r3_"t |+c09IXPUB技术博客T?US(e&X3` z SWu
10IXPUB技术博客\'~C [Fd%l
11IXPUB技术博客F^$]9iq(b _,\t.\qf
12IXPUB技术博客T(Xw'xxR P9C7?M
13
$e2V(Gg|:D014
8P AMA._2X W015IXPUB技术博客%R1q4X E-S"Y;q D1p)|
16
V a'@+R B/W]017
T!d|q9Z-D018IXPUB技术博客7pyRvQl
19IXPUB技术博客3j1{ C Mn?)G D
20
6to*R!g5O"l021IXPUB技术博客5BqCOxG
22
5^.C!jc Yl|$m023
lt_!ML |{G0gT024
PP_#bcxl025
*@ _9D:l#E lJ/_8\ qZ026IXPUB技术博客 W0v$Z+ri9P3t
27IXPUB技术博客7|0r&[bV C
28
S2jt h Otjr029IXPUB技术博客']X0h5s/r*? VpJP
30
MH;`yM)h b031
.T/J8^&HQ Yc]032
+JN^ xc WN1V]Q033
B"ZErY.@J3`)t034
q%u_G`2Mmt+G035IXPUB技术博客7}ef5~o8U tC
36
!E C,K)s6rl9^eqH037IXPUB技术博客"BN)J%f-c$g$B:l
38IXPUB技术博客x-~+S6y!r;zX {W
39
4{8e3I(\dI dS$Uo7O040
NO6z#\JYg041
*B4wEGh@LV:n042IXPUB技术博客0_Ytv{fQc8W
43IXPUB技术博客(d(L A:G3k){3nV0C1dg
44
3[*yuA Y045IXPUB技术博客$\ia T%A+w
46
/E9r/l"WX"q"m047
T*s}+po~#~Zv048IXPUB技术博客&y*Uh([k&y4}
49
V+J b/x,H a'n-o1N050IXPUB技术博客m!NLp ~H,H }bY
51IXPUB技术博客h"T)K2Z"o2f:Q7i
52IXPUB技术博客8}n3X,x"k_
53IXPUB技术博客O0Y z0c~$I S
54
w0g.OX-p~bA6oe055
E"C n/G a!WX*D$f5F:{056IXPUB技术博客}5SY rr,Io3A
57
/h0W*is5Oh:B058IXPUB技术博客5l l%W3y`\)\
59
6s&~6{/W,^*S5@060
U sVX Ld u6B061
#ygt?o;h062IXPUB技术博客+z4C-?x9|*bxo L.[
63IXPUB技术博客@H#MkX t
64IXPUB技术博客-v,Ho1|:g{4[
65
E's*hXB:]1A r \%l066
(fq_ex;f^s067
f+N8C8X@1RE2C068IXPUB技术博客b'fPM8j.m
69IXPUB技术博客o8A&h2S+~:?
70IXPUB技术博客Wet Y4a
71
/J(l.cDJ7d&\A072IXPUB技术博客^h*OH|8w;{6a/Y3E
73IXPUB技术博客9J|wZ4[;o
74IXPUB技术博客3f+I4Iu%j g7D/@y
75IXPUB技术博客MFcb%k3BL;r']D
76
#e3yr@J&V077IXPUB技术博客#|NJPSLfC
78IXPUB技术博客SYQO4gMSK
79IXPUB技术博客U:P7` }nc?,U7r
80IXPUB技术博客I$Jz e:|f
81IXPUB技术博客/f"O6HaS RL!e
82
mP[8^yR%xN&I083IXPUB技术博客B]? mUj/V9R A
84IXPUB技术博客F8z a#V'J3|\
85
0q ^Br:o8HZ086IXPUB技术博客fvjJ)Y Ww
87
3}/jkl+E1`zeWj088
IY/G,?/O!Y089IXPUB技术博客"j1yg^0aG
90IXPUB技术博客k2N5FpOs#M
91
xvm'Zdc6w'UR092IXPUB技术博客 dnK4my6j6n;J H
93
@![6u5o:z094IXPUB技术博客-Ta@*C1T O tK
95
QAE/{9rT0Zs096IXPUB技术博客;]5c`,u ['` w&X!H
97
TI$T,e6F)~D,}"i098
7vF?Z Z`7{099
~vx[Xcx.OsW T0100
iv)Q/uK0h%m/T*i}0101
/***************************************/
B/Y[%Z~6BU\0/* myapp.c */
S's+L.B0coo8y S3?0/***************************************/IXPUB技术博客"FO@,J$D1s&i7l#Y6r
#include <unistd.h>
xzq{(o,p Nc.J0#include <sys/param.h>
i N'XoS&D T1Q0#include <sys/types.h>
b#_Dm@Y*b b0#include <sys/stat.h>IXPUB技术博客\4w-z Op G].d;F
#include <stdio.h>
Y+T3U _ ROsO#p&{0#include <stdlib.h>
us+`t9Q8BkD0#include <time.h>
:@P @*C ocp8xs K0/* global exit status code */IXPUB技术博客%Bj,l?)[~
#define RUN_OK 0IXPUB技术博客m N&^yB|l
#define CONFIG_ERROR 1
Nhcg3N\-\/] u0#define FATAL_ERROR 2
.Q5Zz0S2]7@!Q0/* function declaration */
wZC~R:uUF0int read_config(void);
4t ]gi&UW!L8~0int app_init(void);IXPUB技术博客mh)_f~&iPQ4Pj
void daemonize(void);IXPUB技术博客z%Y4m5?nN F
int main(int argc, char **argv)
)hbVF6\} f0{IXPUB技术博客 t^4qz%p*QwD
FILE *fp;
%q!co2J)n4f0time_t t;
+A ` NA Z/r0/* Read the app configuration here if applicable. */IXPUB技术博客 SJ8xcv rkc+V
/* If error occurred, return non-zero. */IXPUB技术博客]vr&YQ}AF7L*j
if (read_config() != RUN_OK)
+\v\K w)Ucqd0{
O"M&J&{1A K;J IuD,H0printf("%s: read configuration failuren", argv[0]);
O\!Od uVuJ0exit(CONFIG_ERROR);IXPUB技术博客(~JM s2]G
}
~7f3{&tS?0/* Initialize application. Any error, return non-zero. */IXPUB技术博客E7}-z dxc7g6?#t
if (app_init() != RUN_OK)IXPUB技术博客h ~~`z"F
{IXPUB技术博客\(t)Zonp(E:d,P
printf("%s: initialization failuren", argv[0]);IXPUB技术博客F_AkR~*sO_&~
exit(FATAL_ERROR);
W dkkZ6o%y%R4e0}
9q&k(v*nopz pU0daemonize(); /* Make the application a daemon. */
*c*i7e7i9z*at$E"_1Fh w0/* Service logic is placed here. */
h"{nZ0E b\0while (1)
yO;i(Mo:P(N0{
1F4Z#cOwN,{+ad0sleep(5); /* Sleep for 5 seconds. In a real application, it could be */
Jm:d6}&T)M b9g:U0/* waiting for service requests, e.g. waiting on message */IXPUB技术博客M#AYdl
/* queue, etc. */IXPUB技术博客qku!Z9} ]8s `/{
/* service logic */IXPUB技术博客t7uW6ql b0R(f
if ((fp = fopen("/tmp/myapp.log","a")) != NULL)
1QM#RWHO/f tfa0{
'?+i4U9G5y$rd Q&l?0t = time(0);
'C V;T%EzQ7f0fprintf(fp, "myapp is running at %sn",asctime(localtime(&t)));
bd?-Is+_2Gv0fclose(fp);IXPUB技术博客tDx3tHM
}
nt@Y NY7b0elseIXPUB技术博客}lC i)V[#o#f#i
{
?wDY0bD"V#q%W0exit(FATAL_ERROR);IXPUB技术博客5Tg5WLgO o m
}IXPUB技术博客YAy4@~%w{&NI
}IXPUB技术博客])Y%xfpY|k&~]`n$m
}IXPUB技术博客_ `MI x
/* make the application a daemon */IXPUB技术博客T,L;BZ:BsGp
void daemonize(void)IXPUB技术博客~6S9Eq6T-a!R6yB
{IXPUB技术博客9|k E:? m$L
int pid;IXPUB技术博客'|N/]*O` qlgLZAX
int i;
h9q#p_$O b&QW.A0if (pid = fork())
4n g+J,dD0exit(RUN_OK); /* parent exits */IXPUB技术博客%g$zW.gK
else if (pid < 0)IXPUB技术博客bW,SVb!is0wR Z
exit(FATAL_ERROR); /* fork() failed */IXPUB技术博客,JN*wO&EO
/* first child process */
:IOl`U M0setsid();IXPUB技术博客k$P yer
if (pid = fork())IXPUB技术博客9kyr D7fdQ
exit(RUN_OK); /* first child exits */IXPUB技术博客 bg,K LWQGi9J
else if(pid < 0)
S6MN&n T ^*RyhN0exit(FATAL_ERROR); /* fork() failed */
8Q2R9w J6m$X0/* second child */IXPUB技术博客x5RuX$b
for (i = 0; i < NOFILE; ++i) /* close all files */IXPUB技术博客 f[ C)}+s
close(i);
g}6yUV#K-Xy0chdir("/"); /* change directory to root(/) directory */IXPUB技术博客#wmF!v,[P{A'w
umask(0); /* set proper file mask */
'[(sN@1e*r.JU7j1Fb0}
Z0Pr ?Em0/* read configuration */IXPUB技术博客:~N]t!]A,c
int read_config(void)
F Hn,[W cX0{IXPUB技术博客 x M-C?B$W
return RUN_OK; /* OK */
@ FL @4u7R7K!M0}IXPUB技术博客#k!Bl9u9r7Fe
/* initialize application */
O0d?.Rx0int app_init(void)
$?#V4HEs0{IXPUB技术博客9t^ ?9o9Me
return RUN_OK; /* OK */
[s5y:Jco0}IXPUB技术博客ZT f'fBT]~p
IXPUB技术博客 wZi/V;cA

利用Sun公司最新推出的C/C++/Fortran开发及编译环境Sun Studio 11,使用以下命令将myapp.c编译成可执行程序myapp。

mV*QC%L2D aT~0
$ /opt/SUNWspro/bin/cc -o ./myapp ./myapp.c
TVl,T,_Bj0
IXPUB技术博客mt+Kpu d Uj\#w

或者直接使用Solaris 10自带的gcc编译器将myapp.c编译成可执行程序myapp。

9WM~I9}o0
$ /usr/sfw/bin/gcc -o ./myapp ./myapp.cIXPUB技术博客@*o Wt9w4_H$Rq ^S
IXPUB技术博客@"O2dW)QS|5s

编译成功后在当前目录下会生成myapp可执行程序。本例假设当前目录为/export/home/smfdemo。直接在命令行输入. /myapp就可以启动myapp为后台守护进程,同时可以在/tmp目录下找到myapp.log文件。使用“/usr/bin/tail -f /tmp/myapp.log”命令可以看到进程myapp不断在日志文件中报告自己的存在。为了使这个进程在服务器启动时自动运行,传统做法一般需要写三个shell脚本。其中一个shell脚本置于/etc/init.d目录下用以实际启动和停止myapp服务(例如<表2所示的/etc/init.d/myapp.sh)。另外两个shell脚本的名字分别以S和K开头(例如,S79myapp和K79myapp),置于合适的/etc/rc?.d目录下(例如,/etc/rc2.d目录下),分别以不同参数(start和stop)调用 /etc/init.d/myapp.sh。操作系统在boot时会自动运行S开头的脚本以启动myapp服务,而在shutdown时自动运行K开头的脚本以关闭myapp服务。

4[$j v/Zro?0
表2.
1IXPUB技术博客mXo~KRh
2IXPUB技术博客*F7z3y}-sY0ot
3IXPUB技术博客g#z2w/B5W)u
4IXPUB技术博客xl6Va%OkneOEd"\
5
Pz'f G?dg/L06IXPUB技术博客$c1r`Dz$t5pyH
7
d*R1Zj;r5MSgq08
(["j:eoZKKV09
:gIwh6IW010
5n iF o x011
X$?bpy6e+o012
-~%~;k4h%y*d3Or013
;c#o9S h"L?%fWN4f ^014IXPUB技术博客"X4y%WkuVP
15
J&YL x;lR&z/AP016
|~v](md!I017
Ha:H,EFs/O {018
{#n@uIq D8ODj019
'm TXz(K @)|LM020
/t:p0fV ez_2f/L021IXPUB技术博客-}Pn`B/|5mD6| t2@
22
x6Z2D1R e-Tws2a023
R2E,F%J*T9D [,~0a024
Xl"?q:C U Da"O025
/{aM&r0vq9aZ+c026IXPUB技术博客/J)Fp1e*a\z}
27
T'yOx(Y(@#kpuq.w028
6v9G6v$i_u029
B!l#Q(yUc2]3W030
9O~*i r:G9a0
#!/sbin/sh
0y&T)ATo(^0###############################################################################IXPUB技术博客s"]/gY7^\O"@W
# /etc/init.d/myapp.sh #IXPUB技术博客:{)l7B z _"J&_Zn
###############################################################################
#Z7G.|1x|z@|r0RUN_OK=0IXPUB技术博客8H,]/Gps5~.R
CONFIG_ERROR=1
s1m$a}j2C+H*P0FATAL_ERROR=2IXPUB技术博客8t&]0C*s4|#M)~1Q
case "$1" inIXPUB技术博客#mb)\*k.j&@X
'start')
M~*V m5w q[ I"c0/export/home/smfdemo/myapp
1syJG)f1tZ_2I6Kv0if [ $? -eq $CONFIG_ERROR ]; thenIXPUB技术博客ib)m4c0ji
exit $CONFIG_ERROR
o'dpe+uK0fi
1X9y {*k o!w*{@T0if [ $? -eq $FATAL_ERROR ]; thenIXPUB技术博客)eBN\z r
exit $FATAL_ERRORIXPUB技术博客5PJ/GH-{ c)Y p)Y0F5O
fi
*q0b;~Rh(z cDt.F)a0;;
'G-]B'|!pQ0'stop')
)OG la*u?u"HT0/usr/bin/pkill myappIXPUB技术博客/hp_vf
;;IXPUB技术博客 i};D0OR%G8K@#d
*)IXPUB技术博客vtlCH*m g
echo "Usage: $0 { start | stop }"
6`:z2G+K(T4f X0;;IXPUB技术博客 U4R.gG f8g$d
esac
Px;M@wR;k7L0exit $RUN_OK

[ y#r S)nY0SMF可部署的服务

g9i2~#[-w3@(Z0

5L0z"b#x(bb0本节讲述如何将上述例子改为SMF可部署的服务。根据SMF的要求,开发一个SMF可部署的服务需要至少以下几个步骤。IXPUB技术博客^(o*qC [+]

thz:lY4g0创建manifest文件IXPUB技术博客)X0qMJ!P;t

IXPUB技术博客t&Pi3VphE,g

SMF manifest文件是一个XML文件,它用以定义SMF服务各属性。比如,定义服务名称、服务依赖关系、服务启动方法、服务停止方法、服务所需参数等。创建manifest文件最简单的方法是从/var/svc/manifest目录下挑选已存在的相同类型的服务XML文件,将它拷贝到开发目录,比如/export/home/smfdemo目录下,以拷贝件为基础修改而成。本文是个简单的服务,所以参考了 /var/svc/manifest/system/utmp.xml文件(因为它也很简单),在其基础上修改成表3所示的/export/home/smfdemo/myapp.xml。IXPUB技术博客'E$f}cH wc.M

表3.
1
y:R$dtr LV3Tdn02
tdK [!W03
9Ks_A(z04
Y'v G+JM+m,u F7g05
aVD/Q;R5S"gUH o!G]06
"sL~W w~Y7|l07IXPUB技术博客!Z9y$^O8}g
8
*?;W Dq;T;D09IXPUB技术博客O k Y_VY%X%w'TSKa
10IXPUB技术博客4l@ h tz*W"K/lg
11IXPUB技术博客.[%LEtI
12IXPUB技术博客+x,j.V0e[
13
_&}k+g I1w;h014IXPUB技术博客V`I`?*j`9l8P
15IXPUB技术博客xRW b-t!o w q)|*^/s
16IXPUB技术博客/h-b!Fl'w n?
17
&Rxuqp bh S*` p018
;Q:S:wT8k|L(XIz019
bg*h0C#nL(MFc020IXPUB技术博客h0VO5R Esq
21IXPUB技术博客#^YR$rRN
22IXPUB技术博客3c&E9D+_.|
23
!w6Q3w|+nU,L024IXPUB技术博客x*}2D {D"|5{&Af
25
L*X9a+N%e{ u026
s;e7LO3h027
d&o+d9S(Y'Y(Z!ZT028
m.qO ou8]d029
/e$qi8@Xfs4O030
DRO5d+^4r.\h031
m^ Y$vz&LA}7p032IXPUB技术博客+mqWSUg qe}
33
"J [4U_ x oS*Z3Z034IXPUB技术博客0l qp`(W `1@4].X
35
PZh8^$t d&WH036IXPUB技术博客]? O |M!Wg
37
:Qh^9l7Q.{0
<?xml version="1.0"?>IXPUB技术博客S1_:h }0XZIW
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">IXPUB技术博客${C-B6_ @ cL NZ(]
<service_bundle type='manifest' name='mypackage:myapp'>IXPUB技术博客(y'{|%E8M/{ K$B c
<serviceIXPUB技术博客9o9u"bZ$^6uH9U
name='application/myapp'
*X&zC!M+QQvVb0type='service'
gC sn`'^0version='1'>IXPUB技术博客V;G R%egI Wu
<create_default_instance enabled='true' />
p%k8VY`0<single_instance/>
Dm!?;D)dqNf`0<dependency
e#i|c$N!Ls0name='milestone'
b[-hXx:_w0grouping='require_all'
)~g4e lU0restart_on='none'
H/cg:UnKO0type='service'>
fQRJw)S1E0<service_fmri value='svc:/milestone/multi-user' />IXPUB技术博客P'h b D1Q#B#_ I%@a\
</dependency>
Uq1r1kX Sl0<exec_methodIXPUB技术博客JJ;j'_:Cg_z
type='method'IXPUB技术博客0o-g|]Z$] s
name='start'IXPUB技术博客 mEV;a |4}:V
exec='/export/home/smfdemo/myapp.sh start'
S2M-Gh Y#H A[0timeout_seconds='60' />IXPUB技术博客7]2q@Z#OU~A
<exec_methodIXPUB技术博客!a0GuM6}
type='method'
O2~lD'jW0name='stop'IXPUB技术博客#Y-c6C4f aH,qr;j
exec=':kill'
$o5`|`-`/c0timeout_seconds='60' />
jn/i0Dwd)\ |W0</service>IXPUB技术博客Q(lyU zzkr.@
</service_bundle>
o R+};]TNcyr0
IXPUB技术博客?A:yE5A(Dl'PVu

myapp.xml必须符合/usr/share/lib/xml/dtd/service_bundle.dtd.1规范,其意理解如下:IXPUB技术博客w;}i RVZU#e:Y N

zUS!Z s/f J7jP01. <service_bundle>标签用以告知SMF如何处理myapp.xml文件。本例中myapp.xml是一个manifest文件用以定义SMF服务,所以type赋为“manifest”。同时需要给service_bundle一个名字,一般命名规范是以服务所在安装包名为前缀,所以本例将name赋为“mypackage:myapp”。其实name只要不与系统中已有的相重就可以了,当然对于企业级应用服务应该有一个合适的名字。

!D cVKU*y [0

un+a Kg]*XM02. <service>标签主要定义SMF服务的名称,由于myapp只是一个简单应用,所以name赋为“application/myapp”。如果myapp是网络服务,则根据命名规范名字应以“network/”开头加myapp,即 “network/myapp”,请参考/var/svc/manifest/下的目录结构以此类推。type当然应赋为“service”。至于version,根据情况设定,缺省取1。

!LJ$P%d4PgTDx0

wZz*mH03. 根据需要SMF服务可以为同一个服务启动多个实例(instance)。比如,在系统中同一种数据库平台可以启动多个服务实例,分别服务于不同的应用;或者同一种WEB服务平台启动多个服务实例,在不同的端口提供不同WEB应用服务等。在SMF框架中只需定义一个SMF service及属性,在同一个service下定义不同的instance和特定属性即可。service下已定义的属性适用于所有instance,但任何一个instance也可以根据需要特定某个或某几个属性。比如增加属性或覆盖service同名属性定义。由于本例非常简单,只需一个服务一个实例就行了,所以采用标签<single_instance/>,所有属性全部采用service中的属性即可。IXPUB技术博客:T2X3t-c ? V_ Q

H,JB/pccqw+z04. 由于希望myapp服务在系统boot时自动启动,所以将<create_default_instance>标签中enable置为“true”。IXPUB技术博客.V.ly0j)a+H-e

^i#|I lV/B05. <dependency>是manifest文件中最难定义的部分,它定义了此服务所依赖的其他资源,包括服务、文件系统等。一个SMF服务根据需要可以定义多个<dependency>,每个<dependency>具有自己的标识名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”。

7Jm3iS&O5KV0IXPUB技术博客)u$u`%wn [q7n+Uj7c

有关milestone的概念请参看Solaris Service Management Facility - Quickstart Guide

,kPz ?[Y:P0IXPUB技术博客^ jG S)b6_

6. manifest文件必须定义启动和停止服务的方法,<exec_method>标签即用于此目的。原先利用/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秒足矣。IXPUB技术博客g/d UA'm

1p\;\ r4l"D%_^0事实上还有许多标签项目可以设定,但对于本例不是必要的,所以可省略不设。有关manifest文件编写更详细信息,请参看Solaris Service Management Facility - Service Developer IntroductionIXPUB技术博客!a0FS@#n9E"yVh O Gj_

启停方法客户化IXPUB技术博客1?%J%`#h2Wx8z H;t0R'U

SMF框架中svcs(1)命令非常有用,它不但可以列出系统中所有的服务资源及状态,还可以提供那些未正常启动的服务的出错原因、影响范围和可能的恢复方法等。比如,它可以报告说某个服务因为配置不正确而未正常启动,或者某服务遇到致使错误请参SMF的某个日志文件等。SMF之所以能够提供这些信息是由于启动和停止方法提供了相关的信息。SMF要求所有启动和停止方法必须返回一组特定的值,具体值可以参看Solaris 10操作系统/lib/svc/share/smf_include.sh文件尾部。IXPUB技术博客uug DexI_

:{0o,F `V9j#S})f0本例中,表2所示的/etc/init.d/myapp.sh可能返回3种值,$CONFIG_ERROR、$FATAL_ERROR和$RUN_OK。现目标是要替换原返回值为相应的SMF返回值,如果没有相应的SMF返回值,则替换为最合适的SMF返回值,使服务非正常退出时,SMF能够报告可令人接受的错误原因。本例修改方法如下:

+\8J5n5Wb)e0yVq01. 首先,将表2所示的/etc/init.d/myapp.sh文件拷贝到开发目录下,比如/export/home/smfdemo目录下。后面步骤中所有修改都改在拷贝内。
;_0f"\2t:h$_s(`{0

7^'FF5g-} V dXWH02. 通过增加“. /lib/svc/share/smf_include.sh”到myapp.sh头部,将SMF所需的各返回变量和过程包含到myapp.sh脚本。

-_S o1\oXP0

0L W'^ U-T q%d03. 替换“exit $CONFIG_ERROR”为“exit $SMF_EXIT_ERR_CONFIG”,因为$SMF_EXIT_ERR_CONFIG与原退出码$CONFIG_ERROR退出原因最相近。IXPUB技术博客3qer2`f W*[

IXPUB技术博客MS6\6Mk

4. 替换“exit $FATAL_ERROR”为“exit $SMF_EXIT_ERR_FATAL”,因为$SMF_EXIT_ERR_FATAL与原退出码$FATAL_ERROR退出原因最相近。IXPUB技术博客^Q7UgeX%X

5. 替换“exit $RUN_OK”为“exit $SMF_EXIT_OK”,因为$SMF_EXIT_OK与原退出码$RUN_OK退出原因最相近。
)z&dpM+O;O`3l)l0IXPUB技术博客3vtS/v{-^+B`6sG

6. 删除stop case及其操作。因为stop方法已在myapp.xml中另行处理,不再需要myapp.sh了。

(Msx7c,n0IXPUB技术博客m m;k~ay.RXf

7. 修改default case中的echo,以反映正确的usage。IXPUB技术博客K/L;Mt&`:v8E9_

IXPUB技术博客 u*y%E4p1[ s9@ o/},F#W

修改后的myapp.sh如表4所示。至此,所有前期准备工作都已完成,下面就可以进行部署了。IXPUB技术博客@fL{t4I

表4.
1IXPUB技术博客"t*xtA ]
2IXPUB技术博客!j LF/_!c*w
3IXPUB技术博客 ]_5FOG \&A
4IXPUB技术博客3Ed$^ H6v&Z)F
5IXPUB技术博客:J9G2dU/lmN
6
0Hayxl#dz07IXPUB技术博客-^^5|s$K9W
8IXPUB技术博客f&w"eZ'bdu
9
4o0S uv L:A\+A6]L4{010IXPUB技术博客z/r1Q6t[.I$kef
11IXPUB技术博客)lmzp_-`M
12
UnUV-^ux013
TM gZ;]3Sh014IXPUB技术博客[r+f&WEx
15IXPUB技术博客6\0FOj0f/g%K
16IXPUB技术博客 bi}%H}.K
17IXPUB技术博客z2@A7n-IM
18IXPUB技术博客 p"cD!aD8w/p{
19
2t;W b2J(N_k%J020IXPUB技术博客 aT3db*_#eH
21IXPUB技术博客's` ?RD.I} AJ
22IXPUB技术博客k!UkX{K{OO
23IXPUB技术博客a6k!B!|1`,{4j,Ne
24IXPUB技术博客 r0ncYM[
25
!\!x"z7P8}$BMF"U026
P h8P2Qj!U0Z]3y027IXPUB技术博客^`%X/\^HP U/H,CX?zR
28
#!/sbin/sh
$e,_XO @3c y1_^6Av0###############################################################################
Kox n8ur8km$D;Ex(d0# /export/home/smfdemo/myapp.sh #
%`l vx"_pct E0###############################################################################
jI"k5C!|i{3o0. /lib/svc/share/smf_include.sh
;F0dqG tn/w0RUN_OK=0
:`!x^ Xc"^0CONFIG_ERROR=1
1S&V(U3bn&?\0FATAL_ERROR=2
1jV%W^3C8@ R+S0case "$1" in
X9k Q%WZ0'start')
%E:Y(J5| Rk U4~\F0/export/home/hunter/smf/myapp_smfIXPUB技术博客p)xzn _'N a@9~4cP5?
if [ $? -eq $CONFIG_ERROR ]; then
c$q-D5Q a-o"y]0exit $SMF_EXIT_ERR_CONFIG
Oy1e,vm0fi
S d3sy!@tlB0if [ $? -eq $FATAL_ERROR ]; then
*\h u5zq&B;P0exit $SMF_EXIT_ERR_FATAL
p6Q'g/|~)gJ3]|0fiIXPUB技术博客n{?J| F1ua)X
;;IXPUB技术博客t7q*B,Jm/vH
*)IXPUB技术博客F0EM m/C2\
echo "Usage: $0 start"IXPUB技术博客@,KV [(CC
;;
+y7rw?*T(F0esac
(a3@1K~m9l2t0U0exit $SMF_EXIT_OK

t8NQw`!{0部署我的应用为SMF服务

](ry_D1d'}0IXPUB技术博客ad;PD\#y3q

管理和修改SMF服务分别需要solaris.smf.manage和solaris.smf.modify权限,具体请参看 smf_security(5)。缺省只有root有此权限,可使用root部署SMF服务。如果使用普通用户账号,则需要root将solaris.smf.manage和 solaris.smf.modify权限赋予相关用户。方法是在/etc/user_attr文件中加入授权记录。比如为用户hunter加入SMF管理和修改权限,则/etc/user_attr显示如下,其中粗斜体部分为hunter所需的权限。IXPUB技术博客A(q(rC2qrU

,\.F z1m(r3g Bi2^T7?0# cat /etc/user_attr
,E7KYL&f0#IXPUB技术博客5|P$P%yg'Q
# Copyright (c) 2003 by Sun Microsystems, Inc. All rights reserved.IXPUB技术博客L&Mzg/T
#IXPUB技术博客2{'@nk&S)k'B
# /etc/user_attrIXPUB技术博客Y:aq(n"[v [&a
#IXPUB技术博客9L1bU ]?;A
# user attributes. see user_attr(4)
\%G6r4K?;bh0#
"ZQ4eg2q SJ*X0#pragma ident "@(#)user_attr 1.1 03/07/09 SMI"
'|wTDuZ7v0#IXPUB技术博客r'}u`4s [S9l
adm::::profiles=Log Management
X?_,z5r2j'G0lp::::profiles=Printer ManagementIXPUB技术博客1O3L9nD&E}
root::::auths=solaris.*,solaris.grant;profiles=Web Console Management,All;lock_after_retries=noIXPUB技术博客3cO ti#K5J o S#qo
hunter::::auths=solaris.smf.manage,solaris.smf.modify

%ChX,^7Bz0
IXPUB技术博客3} [ V0m+J8b;j6k2g2TQ4\*]h

假设本例中开发目录和所有文件都位于/export/home/smfdemo目录下,则将本例部署为SMF服务的步骤如下:

2E X wD kh$t i"n0

9nG+y:q'b tjo01. 使用svccfg(1M)命令检查myapp.xml文件是否符合XML规范。如果没问题则不会有任何输出,否则根据出错提示修改myapp.xml。IXPUB技术博客)\'?p-gt+v5[O9W

# /usr/sbin/svccfg validate /export/home/smfdemo/myapp.xml
a.g'}/OSK/R(j0
IXPUB技术博客&@ qA)[6N RcD6YW0_']

2. 使用svcs(1)命令看是否已存在名为myapp的服务。如有则必须修改在myapp.xml中定义的服务名,否则继续。

9P:]d5u\v B3Q7c(?0
IXPUB技术博客Dv1A1r~2~

# /usr/bin/svcs application/myapp

0c6W1m0J"D9xq#uw0

4Ebe*x"H03. 使用svccfg(1M)命令加载myapp.xml所定义的服务并自动启动服务。

]&Qwm"T0

,t ZPCb0# /usr/sbin/svccfg import /export/home/smfdemo/myapp.xmlIXPUB技术博客ui(L`*]lKQ3` G

*uW&M0i]d:V^%P04. 使用svcs(1)命令查看myapp服务状态。如状态为online,则说明部署已成功且已运行,否则参看出错原因以及SMF日志以确定问题所在,然后重复上文中相关的步骤后再试。IXPUB技术博客"Ln,e9C5o1MJ(h DB

IXPUB技术博客x y)YB R M3Z

# /usr/bin/svcs -xv application/myappIXPUB技术博客DmAKi

iR(P8Y?1hh/ZOA0至此,我的应用myapp已经成功部署为SMF。

.Dd2k&Xb4x0

Ak{`7q0其他操作

-n ? B ? r"\/w0IXPUB技术博客B,C.bZ{

myapp成为SMF服务后可以使用以下命令进行管理。
3]FFl)_0

5V)Cz;BE(J0N t0

-\@k+_:z#?r lJl _!C:A0T01. 要禁用myapp服务,请使用/usr/sbin/svcadm disable application/myapp。IXPUB技术博客u2?l/\ `?m+wJ

IXPUB技术博客:y-r-i(J*b9C}U

2. 要再次启用myapp服务,请使用/usr/sbin/svcadm enable application/myapp。IXPUB技术博客/\CZs&_4tQ k}[

IXPUB技术博客 Z7B!WrQXB Y;m

3. 要重启myapp服务,请使用/usr/sbin/svcadm restart application/myapp。IXPUB技术博客8fLL@N2b$k U*Z

3\ ~.|yO04. 当myapp服务出现配置错误或其他原因致使myapp的状态为maintenance时,在解决错误原因后,可使用/usr/sbin/svcadm clear application/myapp清除maintenance状态。IXPUB技术博客8j:f&ja|ym }8X!V}

IXPUB技术博客bE(W8i,D4K

5. 当需要对myapp进行维护时,可将其状态改为maintenance状态,方法是/usr/sbin/svcadm mark application/myapp。

9o t qy@jfl]d/Y{T0

H$dpU3U(w_06. 可使用svccfg(1M)命令对myapp进行配置管理。具体方法请参看svccfg(1M)使用说明。IXPUB技术博客;m w"H'Ly*le+t&DdX

IXPUB技术博客7m p2X;a l#c se]m

总结IXPUB技术博客_2f[l*F,P/z&F I!r

:X7n{n!Cy0Solaris 10操作系统是Sun公司最新的下一代操作系统,包含了600多项革新技术,SMF技术就是其中之一。通过使用SMF技术,系统中所有的服务可以在一个统一而强大的平台中进行配置和管理。同时,它也是预测性自愈技术的组成部分,可以自我侦测各服务的运行状态,尽可能地减少服务下线的机率。另外,利用SMF 技术系统管理员可以降低系统维护难度,减少人为出错机会。让我们把自已的应用尽早地部署到SMF框架中去吧。IXPUB技术博客m*O9MQ%S?I^ g

6{ ?2a}N| Q,|0参考资料IXPUB技术博客a t4?)EJ/b{

t2Y SO,^4gd#B01. Predictive Self-Healing at BigAdmin System Administration PortalIXPUB技术博客 }9}7J%P%z*ZgH'|0{
2. SMF System Administration Guide
dk`w W.B]c4v03. Solaris 10操作系统/usr/share/lib/xml/dtd/service_bundle.dtd文件IXPUB技术博客(zhpa0Ct~
4. Solaris 10操作系统上,以下man页面:IXPUB技术博客;m RO(R!A[ER

  • netadm(1M)
  • inetconv(1M)
  • inetd(1M)
  • kernel(1M)
  • smf(5)
  • smf_bootstrap(5)
  • smf_method(5)
  • svc.startd(1M)
  • svcadm(1M)
  • svccfg(1M)
  • svcprop(1)
  • svcs(1)

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar