このセクションでは、1 回の構成を実行する SMF サービスを配布するパッケージの例を示します。
次のパッケージマニフェストは、run-once サービスを配布します。
set name=pkg.fmri value=myapp-run-once@1.0
set name=pkg.summary value="Deliver a service that runs once"
set name=pkg.description \
value="This example package delivers a service that runs once. The service
is marked with a flag so that it will not run again."
set name=org.opensolaris.smf.fmri value=svc:/site/myapplication-run-once \
value=svc:/site/myapplication-run-once:default
set name=variant.arch value=i386
file lib/svc/manifest/site/myapplication-run-once.xml \
path=lib/svc/manifest/site/myapplication-run-once.xml owner=root group=sys \
mode=0444 restart_fmri=svc:/system/manifest-import:default
file lib/svc/method/myapplication-run-once.sh \
path=lib/svc/method/myapplication-run-once.sh owner=root group=bin \
mode=0755
depend fmri=pkg:/shell/ksh93@93.21.0.20110208-0.175.2.0.0.37.1 type=require
depend fmri=pkg:/system/core-os@0.5.11-0.175.2.0.0.37.0 type=require次のスクリプトは、このサービスの構成処理を実行します。このメソッドスクリプトは、スクリプトが 1 回だけ実行されるようにサービスで設定されているプロパティー config/ran を使用します。このプロパティーには、サービスマニフェストとメソッドスクリプトではそれぞれ異なる値が設定されます。exit 呼び出しのコメントが svcs コマンドによって表示されます。
#!/bin/sh
# Load SMF shell support definitions
. /lib/svc/share/smf_include.sh
# If nothing to do, exit with temporary disable.
ran=$(/usr/bin/svcprop -p config/ran $SMF_FMRI)
if [ "$ran" == "true" ] ; then
smf_method_exit $SMF_EXIT_TEMP_DISABLE done "service ran"
fi
# Do the configuration work.
# Record that this run-once service has done its work.
svccfg -s $SMF_FMRI setprop config/ran = true
svccfg -s $SMF_FMRI refresh
smf_method_exit $SMF_EXIT_TEMP_DISABLE done "service ran"次のリストに、この例の 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='site/myapplication-run-once'
type='service'
version='1'>
<dependency
name='fs-local'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local:default' />
</dependency>
<dependent
name='myapplication-run-once-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='/lib/svc/method/myapplication-run-once.sh'
timeout_seconds='60'/>
<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='ran' type='boolean' value='false' />
</property_group>
</instance>
<template>
<common_name>
<loctext xml:lang='C'>
Run-once service
</loctext>
</common_name>
<description>
<loctext xml:lang='C'>
This service checks and sets a property so that it runs
only once. This service is a dependency of the
self-assembly-complete milestone.
</loctext>
</description>
</template>
</service>
</service_bundle>
dependent 要素で、このサービスは self-assembly-complete システムマイルストーンにサービス自体を依存関係として追加します。
svc.startd(1M) がこのサービスの処理を追跡しないように、このサービスの startd/duration プロパティーが transient に設定されています。
このサービスの config/ran プロパティーは false に設定されています。サービスが 1 回だけ実行されるようにするため、サービスメソッドによってこのプロパティーが true に設定されます。
このサービスでは、start メソッドの timeout_seconds は 60 に設定されています。timeout_seconds が 0 に設定されている場合、メソッドスクリプトが終了するまで SMF が無制限に待機します。
このサービスを 1 回だけ実行する理由をユーザーが理解できるようにするため、メソッドスクリプト出口にコメントを組み込み、サービステンプレートデータにサービス名と説明を組み込んでください。
サービスマニフェストが有効であることを確認します。
$ svccfg validate proto/lib/svc/manifest/site/myapplication-run-once.xml
パッケージを発行するの説明に従ってパッケージを発行します。
パッケージのインストール前とインストール後に pkg verify を実行します。各実行の出力を比較して、そのスクリプトが編集可能としてマークされていないファイルの変更を試みないようにします。
パッケージのインストール後に、次の出力を確認します。
svcs コマンドを使用してサービスの状態を表示します。svcs コマンドの各種オプションにより、追加情報が表示されます。ログファイル (-L) に、サービスメソッドが実行されたことが示されます。コメントとサービスの説明に、サービスが無効化されている理由が示されます。
$ svcs myapplication-run-once
STATE STIME FMRI
disabled 16:10:26 svc:/site/myapplication-run-once:default
$ svcs -x myapplication-run-once
svc:/site/myapplication-run-once:default (Run-once service)
State: disabled since April 21, 2014 04:10:26 PM PDT
Reason: Temporarily disabled by an administrator.
See: http://support.oracle.com/msg/SMF-8000-1S
See: /var/svc/log/site-myapplication-run-once:default.log
Impact: This service is not running.
$ svcs -l myapplication-run-once
fmri svc:/site/myapplication-run-once:default
name Run-once service
enabled false (temporary)
state disabled
next_state none
state_time April 21, 2014 04:10:26 PM PDT
logfile /var/svc/log/site-myapplication-run-once:default.log
restarter svc:/system/svc/restarter:default
manifest /lib/svc/manifest/site/myapplication-run-once.xml
dependency require_all/none svc:/system/filesystem/local:default (online)
$ svcs -xL myapplication-run-once
svc:/site/myapplication-run-once:default (Run-once service)
State: disabled since April 21, 2014 04:10:26 PM PDT
Reason: Temporarily disabled by an administrator.
See: http://support.oracle.com/msg/SMF-8000-1S
See: /var/svc/log/site-myapplication-run-once:default.log
Impact: This service is not running.
Log:
[ Apr 21 16:10:22 Enabled. ]
[ Apr 21 16:10:22 Rereading configuration. ]
[ Apr 21 16:10:25 Executing start method ("/lib/svc/method/myapplication-run-once.sh"). ]
[ Apr 21 16:10:26 Method "start" exited with status 101. ]
[ Apr 21 16:10:26 "start" method requested temporary disable: "service ran" ]
Use: 'svcs -Lv svc:/site/myapplication-run-once:default' to view the complete log.
myapplication-run-once サービスが self-assembly-complete サービスの依存関係であることを表示するため、svcs コマンドの -d オプションを使用します。
$ svcs -d svc:/milestone/self-assembly-complete:default | grep once disabled 16:37:20 svc:/site/myapplication-run-once:default
サービスが再度実行されることを防ぐフラグとして使用されるプロパティーの値を確認します。
$ svcprop -p config/ran myapplication-run-once true
次の svccfg コマンドは、サービスマニフェストでこのプロパティーの値が false に設定され、その後 true にリセットされたことを示します。
$ svccfg -s myapplication-run-once:default listprop -l all config/ran config/ran boolean admin true config/ran boolean manifest false
このサービスを有効にすると、ログファイルに "Rereading configuration" 行が出力されず、サービスは構成処理を再実行せずに終了しています。