使用libscf.so实现SMF服务refresh方法( 四 )


本例只使用很少一部分libscf.so中的API调用,API调用列表可参考man libscf(3LIB) 。API调用具体定义可以参考man pages section 3: Extended Library Functions 。有关SMF服务、属性组、属性等概念,以及SMF服务开发方面更多信息,请参阅Solaris Service Management Facility - Service Developer Introduction 。
利用Sun公司最新推出的C/C/Fortran开发及编译环境Sun Studio 11,使用以下命令可将本例将myapp.c编译成可执行程序myapp 。
$ /opt/SUNWspro/bin/cc -o ./myapp ./myapp.c
或者直接使用Solaris 10自带的gcc编译器将myapp.c编译成可执行程序myapp 。
$ /usr/sfw/bin/gcc -o ./myapp ./myapp.c
编译成功后在当前目录下会生成myapp可执行程序 。本例假设当前目录为/export/home/smfdemo 。直接在命令行输入./myapp就可以启动myapp为后台守护进程 。
启动脚本
启动脚本定义了如何启动myapp服务,以及与SMF相应的返回值 。本例启动脚本如表2所示 。
表2. /export/home/smfdemo/myapp.sh
#!/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/smfdemo/myapp
if [ $? -eq $CONFIG_ERROR ]; then
exit $SMF_EXIT_ERR_CONFIG
fi
if [ $? -eq $FATAL_ERROR ]; then
exit $SMF_EXIT_ERR_FATAL
fi
*)
echo "Usage: $0 start"
esac
exit $SMF_EXIT_OK
manifest文件
SMF manifest文件定义了SMF服务各属性 。比如,定义服务名称、服务依赖关系、服务启动方法、服务停止方法、服务刷新方法、服务所需参数等 。本例实现了refresh方法,相应的manifest文件如表3所示 。
表3. /export/home/smfdemo/myapp.xml


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_smf.sh start'
timeout_seconds='60' />
type='method'
name='stop'
exec=':kill'
timeout_seconds='60' />
type='method'
name='refresh'
exec=':kill -8'
timeout_seconds='60' />



本列中refresh方法执行变量exec被设为“:kill -8,通过kill命令向服务发送SIGUSR1信号 。与myapp.c中read_config()逻辑相对应,manifest文件中创建了 myapp属性组(property group) 。它包含一个名为log_filename的字符型属性,初始值设为/tmp/myapp.log 。有关manifest文件编写详细信息,请参看Solaris Service Management Facility - Service Developer Introduction 。
至此,使用libscf.so实现服务refresh方法的所有工作全部完成 。下节中讲述如何将把myapp部署为SMF服务并作简单测试 。
部署和测试部署
管理和修改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所需的权限 。
# cat /etc/user_attr
#
# Copyright (c) 2003 by Sun Microsystems, Inc. All rights reserved.

推荐阅读