プロセス管理

子プロセスのスポーン、監視、通信。メッセージパッシング、スーパービジョン、ライフサイクル管理によるアクターモデルパターンを実装。

processグローバルは常に利用可能。

プロセス情報

現在のフレームIDまたはプロセスIDを取得:

local frame_id = process.id()  -- 呼び出しチェーン識別子
local pid = process.pid()       -- プロセスID

メッセージ送信

PIDまたは登録名でプロセスにメッセージを送信:

local ok, err = process.send(destination, topic, ...)
パラメータ 説明
destination string PIDまたは登録名
topic string トピック名(@で始まることはできない)
... any ペイロード値

権限: ターゲットPIDに対するprocess.send

プロセスのスポーン

-- 基本的なスポーン
local pid, err = process.spawn(id, host, ...)

-- 監視付き(EXITイベントを受信)
local pid, err = process.spawn_monitored(id, host, ...)

-- リンク付き(異常終了時にLINK_DOWNを受信)
local pid, err = process.spawn_linked(id, host, ...)

-- リンクと監視の両方
local pid, err = process.spawn_linked_monitored(id, host, ...)
パラメータ 説明
id string プロセスソースID(例:"app.workers:handler")
host string ホストID(例:"app:processes")
... any スポーンされたプロセスに渡される引数

権限:

  • プロセスidに対するprocess.spawn
  • ホストidに対するprocess.host
  • 監視バリアントの場合はプロセスidに対するprocess.spawn.monitored
  • リンクバリアントの場合はプロセスidに対するprocess.spawn.linked

プロセス制御

-- プロセスを強制終了
local ok, err = process.terminate(destination)

-- オプションのデッドラインでグレースフルキャンセルをリクエスト
local ok, err = process.cancel(destination, "5s")
パラメータ 説明
destination string PIDまたは登録名
deadline string|integer 期間文字列またはミリ秒

権限: ターゲットPIDに対するprocess.terminateprocess.cancel

監視とリンク

既存のプロセスを監視またはリンク:

-- 監視:ターゲット終了時にEXITイベントを受信
local ok, err = process.monitor(destination)
local ok, err = process.unmonitor(destination)

-- リンク:双方向、異常終了時にLINK_DOWNを受信
local ok, err = process.link(destination)
local ok, err = process.unlink(destination)

権限: ターゲットPIDに対するprocess.monitorprocess.unmonitorprocess.linkprocess.unlink

プロセスオプション

local options = process.get_options()
local ok, err = process.set_options({trap_links = true})
フィールド 説明
trap_links boolean LINK_DOWNイベントがeventsチャネルに配信されるかどうか

InboxとEvents

メッセージとライフサイクルイベントを受信するためのチャネルを取得:

local inbox = process.inbox()    -- @inboxトピックからのMessageオブジェクト
local events = process.events()  -- @eventsトピックからのライフサイクルイベント

イベントタイプ

定数 説明
process.event.CANCEL キャンセルがリクエストされた
process.event.EXIT 監視されたプロセスが終了
process.event.LINK_DOWN リンクされたプロセスが異常終了

イベントフィールド

フィールド 説明
kind string イベントタイプ定数
from string ソースPID
result table EXIT用:{value: any}または{error: string}
deadline string CANCEL用:デッドラインタイムスタンプ

トピックサブスクリプション

カスタムトピックをサブスクライブ:

local ch = process.listen(topic, options)
process.unlisten(ch)
パラメータ 説明
topic string トピック名(@で始まることはできない)
options.message boolean trueならMessageオブジェクト、falseなら生のペイロードを受信

Messageオブジェクト

inboxまたは{message = true}で受信する場合:

local msg = inbox:receive()

msg:topic()    -- string: トピック名
msg:from()     -- string|nil: 送信者PID
msg:payload()  -- any: ペイロードデータ

同期呼び出し

プロセスをスポーンし、結果を待って返す:

local result, err = process.exec(id, host, ...)

権限: プロセスidに対するprocess.exec、ホストidに対するprocess.host

プロセスアップグレード

PIDを保持しながら現在のプロセスを新しい定義にアップグレード:

-- 新しいバージョンにアップグレード、状態を渡す
process.upgrade(id, ...)

-- 同じ定義を維持、新しい状態で再実行
process.upgrade(nil, preserved_state)

コンテキストスポーナー

子プロセス用のカスタムコンテキスト付きスポーナーを作成:

local spawner = process.with_context({request_id = "123"})

権限: "context"に対するprocess.context

SpawnBuilderメソッド

SpawnBuilderはイミュータブル - 各メソッドは新しいインスタンスを返す:

spawner:with_context(values)      -- コンテキスト値を追加
spawner:with_actor(actor)         -- セキュリティアクターを設定
spawner:with_scope(scope)         -- セキュリティスコープを設定
spawner:with_name(name)           -- プロセス名を設定
spawner:with_message(topic, ...)  -- スポーン後に送信するメッセージをキュー

権限: :with_actor():with_scope()には"security"に対するprocess.security

Spawnerスポーンメソッド

spawner:spawn(id, host, ...)
spawner:spawn_monitored(id, host, ...)
spawner:spawn_linked(id, host, ...)
spawner:spawn_linked_monitored(id, host, ...)

モジュールレベルのspawn関数と同じ権限。

名前レジストリ

名前でプロセスを登録・検索:

local ok, err = process.registry.register(name, pid)  -- pidはデフォルトでself
local pid, err = process.registry.lookup(name)
local ok = process.registry.unregister(name)

権限: nameに対するprocess.registry.registerprocess.registry.unregister

権限

権限は呼び出しプロセスが何をできるかを制御。すべてのチェックは呼び出し元のセキュリティコンテキスト(アクター)をターゲットリソースに対して使用。

ポリシー評価

ポリシーは以下に基づいて許可/拒否可能:

  • Actor: リクエストを行うセキュリティプリンシパル
  • Action: 実行される操作(例:process.send
  • Resource: ターゲット(PID、プロセスid、ホストid、または名前)
  • Attributes: pid(呼び出し元のプロセスID)を含む追加コンテキスト

権限リファレンス

権限 関数 リソース
process.spawn spawn*() process id
process.spawn.monitored spawn_monitored()spawn_linked_monitored() process id
process.spawn.linked spawn_linked()spawn_linked_monitored() process id
process.host spawn*()call() host id
process.send send() target PID
process.exec call() process id
process.terminate terminate() target PID
process.cancel cancel() target PID
process.monitor monitor() target PID
process.unmonitor unmonitor() target PID
process.link link() target PID
process.unlink unlink() target PID
process.context with_context() "context"
process.security :with_actor():with_scope() "security"
process.registry.register registry.register() name
process.registry.unregister registry.unregister() name

複数の権限

一部の操作は複数の権限を要求:

操作 必要な権限
spawn() process.spawn + process.host
spawn_monitored() process.spawn + process.spawn.monitored + process.host
spawn_linked() process.spawn + process.spawn.linked + process.host
spawn_linked_monitored() process.spawn + process.spawn.monitored + process.spawn.linked + process.host
call() process.exec + process.host
カスタムactor/scope付きスポーン spawn権限 + process.security

エラー

条件 種別
コンテキストが見つからない errors.INVALID
フレームコンテキストが見つからない errors.INVALID
必須引数がない errors.INVALID
予約済みトピックプレフィックス(@ errors.INVALID
無効な期間フォーマット errors.INVALID
名前が登録されていない errors.NOT_FOUND
権限拒否 errors.PERMISSION_DENIED
名前が既に登録済み errors.ALREADY_EXISTS

エラーの処理についてはエラー処理を参照。

関連項目