Oracle® Solaris 11.2 での Image Packaging System を使用したソフトウェアのパッケージ化と配布

印刷ビューの終了

更新: 2014 年 7 月
 
 

1 度だけ実行されるサービスの提供

このセクションでは、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_seconds60 に設定されています。timeout_seconds0 に設定されている場合、メソッドスクリプトが終了するまで 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" 行が出力されず、サービスは構成処理を再実行せずに終了しています。