电脑技术学习

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

dn001

  $ /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

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='mypackage:myapp'>
<service
name='application/myapp'
type='service'
version='1'>
<create_default_instance enabled='true' />
<single_instance/>
<dependency
name='milestone'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/milestone/multi-user' />
</dependency>
<exec_method
type='method'
name='start'
exec='/export/home/smfdemo/myapp_smf.sh start'
timeout_seconds='60' />
<exec_method
type='method'
name='stop'
exec=':kill'
timeout_seconds='60' />
<exec_method
type='method'
name='refresh'
exec=':kill -8'
timeout_seconds='60' />
<property_group name='myapp' type='application'>
<propval name='log_filename' type='astring' value='/tmp/myapp.log' />
</property_group>
</service>
</service_bundle>

标签: