跳过导航链接 | |
退出打印视图 | |
![]() |
在 Oracle Solaris 11.1 中使用映像包管理系统打包和交付软件 Oracle Solaris 11.1 Information Library (简体中文) |
要交付新 SMF 服务,请创建一个交付 SMF 清单文件和方法脚本的软件包。
本节首先讨论交付任何新 SMF 服务的一般情况,然后讨论交付只运行一次的服务的特定情况。最后,本节提供了有关这些服务软件包的自组装的一些提示。
交付新 SMF 服务的软件包通常需要更改系统。
在 SVR4 包管理中,安装后脚本运行 SMF 命令来重新启动 svc:/system/manifest-import:default 服务。
在 IPS 中,将清单文件交付到 lib/svc/manifest 或 var/svc/manifest 的操作应该使用以下执行器进行标记:
restart_fmri=svc:/system/manifest-import:default
此执行器确保当添加、更新或删除清单时,manifest-import 服务将重新启动,从而添加、更新或删除通过该 SMF 清单交付的服务。
如果软件包添加到实时系统,一旦在打包操作期间将所有软件包都添加到了系统就会执行此操作。如果软件包添加到备用引导环境,则在引导环境的第一次引导期间执行该操作。
需要执行新软件环境的一次配置的软件包应交付 SMF 服务以执行此配置。
交付应用程序的软件包应包含以下操作:
file path=opt/myapplication/bin/run-once.sh owner=root group=sys mode=0755 file path=lib/svc/manifest/application/myapplication-run-once.xml owner=root group=sys \ mode=0644 restart_fmri=svc:/system/manifest-import:default
服务的 SMF 方法脚本可以包含进一步配置应用程序或修改系统使应用程序有效运行所需的任何内容。在此示例中,方法脚本写入简单的日志消息:
#!/usr/bin/sh . /lib/svc/share/smf_include.sh assembled=$(/usr/bin/svcprop -p config/assembled $SMF_FMRI) if [ "$assembled" == "true" ] ; then exit $SMF_EXIT_OK fi svccfg -s $SMF_FMRI setprop config/assembled = true svccfg -s $SMF_FMRI refresh echo "This is output from our run-once method script"
通常,如果应用程序尚未配置,SMF 服务应仅执行工作。此示例方法脚本检查 config/assembled。备用方法是将服务和应用程序分开打包,然后使用方法脚本删除包含该服务的软件包。
当测试方法脚本时,在运行执行器的软件包安装前或安装后运行 pkg verify。比较每个运行的输出来确保脚本没有尝试修改任何未标记为可编辑的文件。
下面显示了此示例的 SMF 服务清单:
<?xml version="1.0"?> <!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> <service_bundle type='manifest' name='MyApplication:run-once'> <service name='application/myapplication/run-once' type='service' version='1'> <single_instance /> <dependency name='fs-local' grouping='require_all' restart_on='none' type='service'> <service_fmri value='svc:/system/filesystem/local:default' /> </dependency> <dependent name='myapplication_self-assembly-complete' grouping='optional_all' restart_on='none'> <service_fmri value='svc:/milestone/self-assembly-complete' /> </dependent> <instance enabled='true' name='default'> <exec_method type='method' name='start' exec='/opt/myapplication/bin/run-once.sh' timeout_seconds='0'/> <exec_method type='method' name='stop' exec=':true' timeout_seconds='0'/> <property_group name='startd' type='framework'> <propval name='duration' type='astring' value='transient' /> </property_group> <property_group name='config' type='application'> <propval name='assembled' type='boolean' value='false' /> </property_group> </instance> </service> </service_bundle>
请注意,SMF 服务的 startd/duration 属性设置为 transient,所以 svc.startd(1M) 不跟踪此服务的进程。还要注意服务将自身添加为 self-assembly-complete 系统里程碑的相关项。
本节提供了编写 SMF 方法时支持软件包自组装的一些附加提示。
如果每次运行方法脚本时通过已打包配置文件片段编译配置文件的成本较高,请考虑在方法脚本中使用以下测试。
对已打包配置文件片段的目录运行 ls -t,然后使用 head -1 来选择最近更改的版本。将此文件的时间戳与通过那些片段编译的未打包配置文件的时间戳比较,确定服务是否需要重新编译配置文件。
以上所示的示例 SMF 服务清单为 start 方法定义了 timeout_seconds='0'。这意味着 SMF 将会无限期地等待自组装完成。
为了有助于调试,您可能想要对自组装过程强加一个有限超时,从而使 SMF 在出现问题时将服务下降至维护状态。