svc.periodicd - サービス管理機能の定期的なリスタータ
/lib/svc/bin/svc.periodicd
svc:/system/svc/periodic-restarter:default
svc.periodicd は、サービス管理機能 (SMF) のリスタータであり、長時間実行のデーモンとしてではなく、一定の間隔で実行される必要のある短時間実行のプロセスとして実装されるサービスを処理します。このようなサービスは、定期的なサービスと呼ばれています。
svc.periodicd は、起動時に system/svc/periodic-restarter サービスの一部として自動的に呼び出され、なんらかの障害が発生した場合は自動的に再起動されます。svc.periodicd を直接呼び出さないでください。
すべてのリスタータに共通する構成および動作については、smf_restarter(7) のマニュアルページを参照してください。
svcs コマンドは、svc.periodicd によって管理されているサービスの詳細なステータスを報告できます。詳細は、svcs(1) のマニュアルページを参照してください。
定期的なサービスは、svc.startd(8) で説明されているメソッドのうちの 1 つだけをサポートしています。定期的なサービスでサポートされているのは start メソッドのみです。stop メソッドおよび refresh メソッドは、定期的なリスタータでサポートされておらず、定義されている場合は無視されます。
svc.periodicd では、サービスの重要なリスタータアクションに加えて、メソッドの標準出力および標準エラーのファイル記述子も /var/svc/log/service:instance.log に記録します。
定期的なサービス (svc.periodicd によって管理されるサービス) はその性質上、そのようなサービスに相当するプロセスが、サービスがオンラインになっている間中持続しているわけではないという点でほかのサービスとは異なります。むしろ定期的なサービスは、一定の間隔で実行される比較的実行時間の短いプロセスで構成されます。たとえば、リモートリソースのステータスを 30 秒ごとに 1 回チェックしたり、ソフトウェア更新を毎週ダウンロードしたりするために定期的なサービスを使用できます。svc.periodicd でこの動作を実装するには、一定の間隔で委任インスタンスに対して start メソッドを実行します。
定期的なサービスを開発または構成するときに一連の共通プロパティーを使用すると、svc.periodicd によってサービスが処理される方法を変えることができます。svc.periodicd では、svc.startd(8) に説明されている共通プロパティーのほかに、次の一連のプロパティーも認めています。それらの各プロパティーは、「periodic」というプロパティーグループに含まれています。
サービスの start メソッドの呼び出しと呼び出しの間の待機時間を指定する時間値。このプロパティーは必須です。
period に到達してから start メソッドが実際に実行されるまでのランダム遅延を指定する時間値。遅延の範囲は 0 秒からこのプロパティーの値までです。このプロパティーはオプションであり、未定義の場合は 0 と見なされます。
サービスが「オンライン」状態に達してから、そのサービスの start メソッドが呼び出されるまでの待機時間を指定する時間値。このプロパティーはオプションであり、未定義の場合は 0 と見なされます。総遅延時間は、periodic/delay と periodic/jitter の合計です。
定期的なリスタータがシステムの停止時間中もずっとインスタンスのスケジューリングを維持すべきかどうかを示すブール値。この値が false の場合、インスタンスははじめてオンライン状態に達したかのようにブートからスケジュールされます。この値が true の場合、定期的なリスタータは代わりに、インスタンスの periodic_restarter/next_run プロパティーの現在の値でインスタンスの start メソッドを実行します。その値が過去のものである場合は、停止時間が発生する前に設定された時間の次の倍数で行われるように次の実行がスケジュールされます。
システムの停止時間のせいで抜けてしまった実行を埋め合わせるために、ブート時に定期的なリスタータによってサービスの start メソッドを呼び出すべきかどうかを示すブール値。このプロパティーを有効にするには、periodic/persistent プロパティーも true にする必要があります。それ以降の実行はスケジュールどおりに行われます。
スケジュールされているサービスは、定期的なサービスとほぼ同じように動作します。大きな違いは、スケジュールされているサービスが一定の間隔ではなく特定の時間に実行されることです。たとえば、いくつかのディレクトリのバックアップを毎週日曜日の 18:00 に作成するために使用できます。
スケジュールされているサービスを開発または構成するときに一連の共通プロパティーを使用すると、svc.periodicd によってサービスが処理される方法を変えることができます。svc.periodicd では、svc.startd(8) に説明されている共通プロパティーのほかに、次の一連のプロパティーも認めています。それらの各プロパティーは、「schedule」タイプのプロパティーグループに含まれています。
この値および frequency の値はともに、サービスの start メソッドが実行される頻度を定義します。使用できる値は、「year」、「month」、「week」、「day」、「hour」、および「minute」です。サービスの start メソッドは、スケジュールされた時間ごとに厳密に 1 回ずつ実行されるよう保証されています。つまり、「day」というスケジュールが設定されたサービスでは、その start メソッドが毎日正確に 1 回実行されることになります。
この値は、サービスの start メソッドが実行されるまでに経過する必要のある間隔の数を定義します。つまり、間隔 (interval) が週 (week)、頻度 (frequency) が 3 である場合、start メソッドは 3 週間ごとに実行されます。有効な値は正の整数です。このプロパティーはオプションであり、未定義の場合は 1 と見なされます。
この値は、サービスの start メソッドの実行時間を求めるために使用されるタイムゾーンを指定します。この値はオプションであり、省略した場合はシステムのタイムゾーンと見なされます。それ以外の場合、有効な値はタイムゾーン名です。
スケジュールのベースとなるグレゴリオ暦の年を指定する値。このプロパティーは、スケジュールされているサービスを 1 以外の頻度 (frequency) で作成する場合にのみ役立ち、スケジュールの残りの部分を計算するときのベースとなる参照ポイントを作成します。
ISO の週と曜日による年に基づいて、サービスが ISO 8901 のどの週に実行されるようにスケジュールするかを指定する値。有効な値は 1 - 53 です。負の数を使用すると、その年の終わりから遡って計算できます。
サービスがどの月に実行されるようにスケジュールするかを指定する値。有効な値は、1 - 12、月の正式名称、またはその月を表す 3 文字の略語です。どの名前も C ロケールを使用して指定する必要があります。負の数を使用すると、その年の終わりから遡って計算できます。
サービスがその月の何週目の平日に実行されるようにスケジュールするかを指定する値。有効な値は 1 - 5 です。負の数を使用すると、その月の終わりから遡って計算できます。
サービスが ISO 6801 のどの曜日に実行されるようにスケジュールするかを指定する値。有効な値は、1 - 7、曜日の正式名称、またはその曜日を表す 3 文字の略語です。どの名前も C ロケールを使用して指定する必要があります。負の数を使用すると、その週の終わりから遡って計算できます。
サービスがその月の何日目に実行されるようにスケジュールするかを指定する値。有効な値は 1 - 31 です。月の日数がこのプロパティーの値よりも少ない場合は、その月の最後の日にサービスの start メソッドが実行されます。負の数を使用すると、その月の終わりから遡って計算できます。このプロパティーを day プロパティーとともに使用することはできません。
サービスがその日の何時に実行されるようにスケジュールするかを指定する値。有効な値は 0 - 23 です。負の数を使用すると、その日の終わりから遡って計算できます (-1 から -24)。指定された時間が特定の日に複数発生する場合は、最初に発生した時間にのみサービスの start メソッドが実行されます。その時間が特定の日に発生しない場合は、その次の時間にサービスの start メソッドが実行されます。
サービスがその時間の何分に実行されるようにスケジュールするかを指定する値。有効な値は 0 - 59 です。負の数を使用すると、その時間の終わりから遡って計算できます (-1 から -60)。
システムの停止時間のせいで抜けてしまった実行を埋め合わせるために、ブート時に定期的なリスタータによってサービスの start メソッドを呼び出すべきかどうかを示すブール値。
このプロパティーグループ内の必須プロパティーは、「interval」のみです。他のすべてのプロパティー (recovery を除く) は、スケジュールにさらなる制約をかけるために使用されます。制約をもたらすプロパティーは、間隔 (interval) の値よりも時間の長さが短いものだけです。「interval」の値が「week」である場合、「scheduled/day」の値を「minute」に至るまで定義することによってそのスケジュールを制約することは認められます。制約は「interval」の値から 1 レベル下げて設定する必要があり、持続的である必要もありますが、使用可能なすべての制約を定義する必要はありません。実際、サービスの開発者は定義する制約ができるだけ少なくなるよう推奨されています。このように、指定された日の特定の時間に実行されるようサービスをスケジュールできますが、それを svc.periodicd に委任することで、その時間の何分にサービスの start メソッドを実行すべきかまで決めることができます。
start メソッドの最初の呼び出しでは、未定義の制約は乱数値を取ります。それ以降の呼び出しでは、サービスの start メソッドの実行間隔が十分に離されるように、svc.periodicd によってある程度の一貫性が保たれます。具体的には、サービスの最初の呼び出しでのみ、制約を受けない最初の単位時間がランダムに生成され、その後サービスが無効になるまで使用されます。間隔 (interval) が「year」で、その他の制約のないサービスは常に、その年の同じ月に実行されますが、必ずしもその月の同じ日に実行されるとは限りません。同様に、スケジュールが「week」で、「day」の制約があるサービスは常に、その曜日の同じ時間に実行されますが、必ずしもその時間の同じ分に実行されるとは限りません。
「frequency」の値が 1 よりも大きい場合は、「interval」の値またはそれよりも上の値ですべての制約を指定する必要もあります。こうした状況で定義した場合、それらの制約はスケジュールの残りの部分を計算するときのベースとなる参照ポイントを決めるために使用されます。間隔 (interval) が「year」で頻度 (frequency) が「2」のサービスでは、「year = 2002」または「year = 1936」の制約を指定することで、サービスの start メソッドが偶数年に実行されるようにできます。これらの制約は参照ポイントであり、開始日や終了日を表すものではありません。値の選択がサービスの start メソッドの実行される時期を正確に反映するのであれば、どの年のどの日付のどの時間でも使用できます。
svc.periodicd によって管理されるサービスは、smf(7) で説明されている状態のいずれかになります。このリスタータによって状態の定義が変更されることはありません。
svc.periodicd は、svc.startd(8) の「サービス障害」セクションで概説されている障害の条件に 2 つの変更点を加えたものに準拠しています。SMF_EXIT_TEMP_TRANSIENT 終了コードは、SMF_EXIT_ERR_OTHER と同じように扱われます。また、実行時間が構成された時間よりも長いが、構成されたメソッドのタイムアウトよりも短いようなメソッドが実行された場合、svc.periodicd(8) ではそのメソッドを再度呼び出そうとはせず、代わりにそのメソッドが終了するまで待機し、構成された時間の次の倍数でそのメソッドを呼び出します。
インスタンスの障害がはじめて発生した場合、そのインスタンスは「機能低下 (DEGRADED) 」状態になります。障害が 3 回連続して発生した場合、インスタンスはすぐに保守 (MAINTENANCE) 状態になります。3 回目の障害が発生する前に呼び出しに成功した場合、インスタンスはオンライン (ONLINE) 状態に戻ります。
次の例は、単純な定期的サービスのマニフェストです。「svcadm enable example/periodic_service:default」の呼び出しのあと、svc.periodicd は 15 - 20 秒間待機してから start メソッドを実行します。start メソッドの最初の呼び出し以降、メソッドは 30 - 35 秒ごとに実行されます。
<?xml version='1.0'?> <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'> . <service_bundle type='manifest' name='SUNWsvc:test'> . <service name='example/periodic_service' type='service' version='1'> . . <instance name='default' enabled='false'> . <periodic_method period='30' delay='15' jitter='5' exec='/usr/bin/periodic_service_method' timeout_seconds='0'> <method_context> <method_credential user='root' group='root' /> </method_context> </periodic_method> . </instance> . </service> . </service_bundle>使用例 2 スケジュールされているサービスの作成
下記の例は、単純なスケジュールされているサービスのマニフェストです。svc.periodicd は、このサービスの start メソッドを毎月最初の日の午前 2:00 - 3:00 に実行します。
<?xml version='1.0'?> <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'> <service_bundle type='manifest' name='SUNWsvc:test'> <service name='example/scheduled_service' type='service' version='1'> <instance name='default' enabled='true'> <scheduled_method interval='month' day='1' hour='2' 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>使用例 3 頻度を使用したスケジュールされているサービスの作成
下記の例は、1 よりも大きい頻度 (frequency) を使用した、スケジュールされているサービスのマニフェストです。svc.periodicd はこのサービスの start メソッドを、5 で割り切れる年の感謝祭 (米国の場合) の日に実行します。
<?xml version='1.0'?> <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'> <service_bundle type='manifest' name='SUNWsvc:test'> <service name='example/scheduled_service' type='service' version='1'> <instance name='default' enabled='true'> <scheduled_method interval='year' frequency='5' year='1900' month='nov' weekday_of_month='4' day='Thu' 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>使用例 4 複数週のサービスの作成
下記の例は、スケジュールされているサービスのマニフェストです。svc.periodicd は、2027 年の 15 週目を参照ポイントとして使用し、このサービスの start メソッドを 3 週間ごとの火曜日の午後 10:30 に実行します。
<?xml version='1.0'?> <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'> <service_bundle type='manifest' name='SUNWsvc:test'> <service name='example/scheduled_service' type='service' version='1'> <instance name='default' enabled='true'> <scheduled_method interval='week' frequency='3' year='2027' week_of_year='15' day='2' hour='22' minute='30' 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>
属性についての詳細は、マニュアルページの attributes(7) を参照してください。
|
svcs(1), service_bundle(5), smf(7), smf_method(7), svc.startd(8)