Go to main content
Oracle® Solaris 11.3 でのシステムサービスの開発

印刷ビューの終了

更新: 2016 年 11 月
 
 

スケジュールされているサービスの起動メソッド実行のスケジュール

(scheduled_method 要素の exec 属性によって指定された) スケジュールされているサービスインスタンスの起動メソッドの実行をスケジュールするには、scheduled_method 要素の interval 属性と frequency 属性の値が常に必要です。frequency 属性のデフォルト値は 1 です。interval 属性の値は明示的に設定する必要があります。タイプ schedule のプロパティーグループの scheduled_method 要素またはプロパティーに指定したその他の属性も使用され、next_run 値が使用されることがあります。

間隔ごとに 1 回の呼び出しのスケジュール

frequency の値が 1 の場合、スケジュールされているサービスインスタンスの起動メソッドは最初に、指定された最小の制約内のランダムな時間に呼び出されます。後続の呼び出しは、次の実行間隔内で次に短い制約の同一単位内で発生します。たとえば、intervalweek で、ほかのスケジューリング制約が指定されていない場合、起動メソッドは最初に、その週のランダムな時間に呼び出されます。起動メソッドがたとえば 2 日連続で呼び出されないように、後続の呼び出しは将来の週の同じ曜日に発生します。同様に、intervalweek で、dayhour も指定されている場合、起動メソッドは最初に、指定された日の指定された時間のランダムな時刻に呼び出されます。後続の呼び出しは、将来の週の指定された日時の同じ分に発生します。

複数の間隔ごとに 1 回の呼び出しのスケジュール

frequency の値が 1 より大きい場合、最初の呼び出しの時間を設定するために、時間の長さが interval 値以上のスケジューリング制約が使用されます。year から、interval 値と同じ長さの時間までのすべての制約を指定する必要があります。たとえば、intervalweek の場合、yearweek_of_year の値を指定する必要があります。

intervalweekfrequency2year2014week_of_year が 2 - 52 までの任意の偶数である場合、起動メソッドは偶数週ごとに呼び出されます。week_of_year が 1 - 53 までの任意の奇数である場合、起動メソッドは奇数週ごとに呼び出されます。2014 年はすでに過ぎているため、この例の week_of_year 属性の値は、起動メソッドが最初に呼び出される特定の週を示しているのではなく、この起動メソッドが呼び出されるのが次の偶数週なのか次の奇数週なのかのみを示しています。2015 年のように 53 週ある年のあとでは、偶数週に最初に呼び出された起動メソッドは奇数週に呼び出されるように、後続の呼び出しは 2 週間ごと発生します。

intervalweekfrequency4year2014week_of_year1 の場合、起動メソッドは 2015 年の第 1 週、第 5 週、第 9 週などに呼び出されます。2015 年は 53 週あるため起動メソッドは第 53 週に呼び出され、2016 年には起動メソッドは第 4 週、第 8 週、第 12 週などに呼び出されます。

不規則な間隔での呼び出しのスケジュール

場合によっては、1 セットのスケジューリング制約ではスケジュールを定義するために十分ではありません。スケジュールされているサービスには、タイプ schedule のプロパティーグループを複数指定できます。定期的なリスタータは、タイプ schedule の各プロパティーグループの各プロパティーの値を組み合わせて、スケジュールされているサービスインスタンスの起動メソッドの呼び出しをスケジュールします。

スケジュールを定義するためには、スケジュールされているサービスには必要な数のスケジューリング制約を指定するべきであるのと同様に、タスクに必要なスケジュールを定義するには、スケジュールされているサービスには必要な数の schedule プロパティーグループのみを指定するべきです。

使用例 4  12 時間ごとの呼び出し

この例では、起動メソッドは毎日 06:00 と 18:00 に呼び出されます。hour 属性の値には 6 または 18 のいずれかを指定できます。

<?xml version='1.0'?>
<!DOCTYPE service_bundle
  SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='site/sample-periodic-svc'>
    <service type='service' version='1' name='site/sample-periodic-svc'>

        <instance name='default' enabled='false'>

            <scheduled_method
                interval='hour'
                frequency='12'
                hour='6'
                minute='0'
                exec='/usr/bin/scheduled_service_method'
                timeout_seconds='0'>
                    <method_context>
                        <method_credential user='root' group='root' />
                    </method_context>
            </scheduled_method>

        </instance>
    </service>
</service_bundle>
使用例 5  毎日 03:00 および 23:00 の呼び出し

この例では、起動メソッドを毎日 03:00 と 23:00 に呼び出すために、追加の schedule プロパティーグループを指定します。

<?xml version='1.0'?>
<!DOCTYPE service_bundle
  SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='site/sample-periodic-svc'>
    <service type='service' version='1' name='site/sample-periodic-svc'>

        <instance name='default' enabled='false'>

            <scheduled_method
                interval='day'
                hour='3'
                minute='0'
                exec='/usr/bin/scheduled_service_method'
                timeout_seconds='0'>
                    <method_context>
                        <method_credential user='root' group='root' />
                    </method_context>
            </scheduled_method>

            <property_group name='run2' type='schedule'>
                <propval name='interval' type='astring' value='day' />
                <propval name='hour' type='integer' value='23' />
                <propval name='minute' type='integer' value='0' />
            </property_group>

        </instance>
    </service>
</service_bundle>
使用例 6  火曜日と木曜日の 03:00 と 23:00 の呼び出し

毎週火曜日と木曜日の 03:00 と 23:00 に起動メソッドを呼び出すには、この例に示されているように 3 つの追加の schedule プロパティーグループが必要です。

<?xml version='1.0'?>
<!DOCTYPE service_bundle
  SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='site/sample-periodic-svc'>
    <service type='service' version='1' name='site/sample-periodic-svc'>

        <instance name='default' enabled='false'>

            <scheduled_method
                interval='week'
                day='3'
                hour='3'
                minute='0'
                exec='/usr/bin/scheduled_service_method'
                timeout_seconds='0'>
                    <method_context>
                        <method_credential user='root' group='root' />
                    </method_context>
            </scheduled_method>

            <property_group name='run2' type='schedule'>
                <propval name='interval' type='astring' value='week' />
                <propval name='day' type='astring' value='3' />
                <propval name='hour' type='integer' value='23' />
                <propval name='minute' type='integer' value='0' />
            </property_group>

            <property_group name='run3' type='schedule'>
                <propval name='interval' type='astring' value='week' />
                <propval name='day' type='astring' value='5' />
                <propval name='hour' type='integer' value='3' />
                <propval name='minute' type='integer' value='0' />
            </property_group>

            <property_group name='run4' type='schedule'>
                <propval name='interval' type=astring'' value='week' />
                <propval name='day' type='astring' value='5' />
                <propval name='hour' type='integer' value='23' />
                <propval name='minute' type='integer' value='0' />
            </property_group>

        </instance>
    </service>
</service_bundle>

サービスがすでにインポートされている場合、サイトプロファイルを使用するか、svccfg のサブコマンド addpg および setprop を使用することで、これらの追加のプロパティーグループを指定できます。

1 つの間隔において可能な複数の呼び出しの解決

単一の間隔で起動メソッドの複数の呼び出し時間が可能になるようにスケジューリング制約を指定する場合、起動メソッドは、すべての制約と一致するもっとも早い時間に呼び出されます。単一の間隔で可能になる複数の呼び出し時間の例は、サマータイムから標準時間への切り替え時に、01:00 から 02:00 までの時間が 2 回発生する場合です。

システムの停止時間後のスケジュール

recover プロパティーは、スケジュールされているインスタンスがシステムの停止時間から回復したときに、スケジュールされているインスタンスメソッドが実行される時間を変更できます。

recover プロパティーの値が true の場合、インスタンスがシステムの停止時間から回復したら可能なかぎりすぐに、定期的なリスタータはスケジュールされているサービスインスタンスの起動メソッドを呼び出します。後続の呼び出しは、interval 値と frequency 値および指定されているその他の制約に従って発生します。

recover プロパティーの値が false の場合、定期的なリスタータは、next_run プロパティーによって指定された時間に、スケジュールされているサービスインスタンスの起動メソッドを呼び出します。next_run プロパティーの値が過去の値の場合、将来の起動メソッドの呼び出しは、interval 値と frequency 値および指定されているその他の制約に従って発生します。next_run プロパティーの説明は、起動メソッドの最後および次の呼び出しに記載されています。

サービスの再起動後のスケジュール

定期的なリスタータサービス (svc:/system/svc/periodic-restarter) は、終了した場合に自動的に再起動しようとします。定期的なリスタータサービスが障害後に再起動されると、スケジュールされている各インスタンスの起動メソッドは、next_run プロパティーによって指定された時間に呼び出されます。next_run プロパティーの値が過去の値の場合、将来の起動メソッドの呼び出しは、interval 値と frequency 値および指定されているその他の制約に従って発生します。next_run プロパティーの説明は、起動メソッドの最後および次の呼び出しに記載されています。

スケジュールされているサービスインスタンスが再起動されると、インスタンスの起動メソッドは、interval 値と frequency 値および指定されているその他の制約に従って呼び出されます。

起動メソッドの問題後のスケジュール

起動メソッドはタスクを実行したあとで、interval および frequency プロパティーで指定された期間内に終了します。定期的なリスタータが次にスケジュールされている期間に起動メソッドを呼び出そうとしたときに契約済みのプロセスがまだ存在する場合、その期間の呼び出しはスキップされ、定期的なリスタータは次の期間に再度起動メソッドを呼び出そうとします。

timeout_seconds 値で指定された秒数より長く起動メソッドが実行される場合、契約内のすべてのプロセスが終了し、呼び出しは致命的でない障害になります。はじめて起動メソッドが致命的でない障害で終了すると、インスタンスは degraded 状態になり、起動メソッドの呼び出しは、interval 値と frequency 値および指定されているその他の制約に従ってスケジュールどおりに続行されます。次の 2 つの呼び出しのいずれかが成功した場合、インスタンスは online 状態に戻されます。

起動メソッドの致命的でない障害が 3 回連続して発生したあとで、インスタンスは degraded 状態から maintenance 状態に遷移します。起動メソッドの最初の致命的な障害時に、サービスは maintenance 状態になります。Oracle Solaris 11.3 でのシステムサービスの管理 の 機能低下、オフライン、または保守であるインスタンスの修復を参照してください。