このセクションでは、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" 行が出力されず、サービスは構成処理を再実行せずに終了しています。