프로세스 관리
자식 프로세스를 스폰하고 모니터링하며 통신합니다. 메시지 전달, 슈퍼비전, 수명 주기 관리를 갖춘 액터 모델 패턴을 구현합니다.
전역 변수 process는 항상 사용 가능하며, require()가 필요 없고 modules:에 나열할 필요도 없습니다.
프로세스 정보
현재 프레임 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.terminate, process.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.monitor, process.unmonitor, process.link, process.unlink
프로세스 옵션
local options = process.get_options()
local ok, err = process.set_options({trap_links = true})
| 필드 | 타입 | 설명 |
|---|---|---|
trap_links |
boolean | LINK_DOWN 이벤트가 이벤트 채널에 전달되는지 여부 |
인박스와 이벤트
메시지와 라이프사이클 이벤트를 받기 위한 채널 가져오기:
local inbox = process.inbox() -- @inbox 토픽의 메시지 객체
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이면 raw 페이로드 |
메시지 객체
인박스 또는 {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)
컨텍스트 Spawner
자식 프로세스를 위한 커스텀 컨텍스트로 spawner 생성:
local spawner = process.with_context({request_id = "123"})
권한: "context"에 대해 process.context
옵션이 있는 Spawner
process.with_options(options)는 컨텍스트 값 대신 스폰 시점의 옵션(예: 네트워크 선택자)을 가진 spawner를 생성합니다:
local spawner = process.with_options({network = "app:tor_proxy"})
| 옵션 | 타입 | 설명 |
|---|---|---|
network |
string | 자식 프로세스의 아웃바운드 연결에 사용할 network.* 엔트리의 레지스트리 ID |
권한: "context"에 대해 process.context; 네트워크를 선택하려면 추가로 해당 네트워크 ID에 대해 network.select가 필요합니다.
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, ...)
모듈 수준 스폰 함수와 동일한 권한.
이름 레지스트리
이름으로 프로세스 등록 및 조회:
local ok, err = process.registry.register(name, pid) -- pid 기본값은 self
local pid, err = process.registry.lookup(name)
local ok = process.registry.unregister(name)
권한: 이름에 대해 process.registry.register, process.registry.unregister
권한
권한은 호출 프로세스가 할 수 있는 것을 제어합니다. 모든 검사는 대상 리소스에 대해 호출자의 보안 컨텍스트(액터)를 사용합니다.
정책 평가
정책은 다음을 기반으로 허용/거부할 수 있습니다:
- 액터: 요청을 만드는 보안 주체
- 액션: 수행되는 작업 (예:
process.send) - 리소스: 대상 (PID, 프로세스 id, 호스트 id, 또는 이름)
- 속성:
pid(호출자의 프로세스 ID)를 포함한 추가 컨텍스트
권한 참조
| 권한 | 함수 | 리소스 |
|---|---|---|
process.spawn |
spawn*() |
프로세스 id |
process.spawn.monitored |
spawn_monitored(), spawn_linked_monitored() |
프로세스 id |
process.spawn.linked |
spawn_linked(), spawn_linked_monitored() |
프로세스 id |
process.host |
spawn*(), exec() |
호스트 id |
process.send |
send() |
대상 PID |
process.exec |
exec() |
프로세스 id |
process.terminate |
terminate() |
대상 PID |
process.cancel |
cancel() |
대상 PID |
process.monitor |
monitor() |
대상 PID |
process.unmonitor |
unmonitor() |
대상 PID |
process.link |
link() |
대상 PID |
process.unlink |
unlink() |
대상 PID |
process.context |
with_context() |
"context" |
process.security |
:with_actor(), :with_scope() |
"security" |
process.registry.register |
registry.register() |
이름 |
process.registry.unregister |
registry.unregister() |
이름 |
다중 권한
일부 작업은 여러 권한이 필요합니다:
| 작업 | 필요한 권한 |
|---|---|
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 |
exec() |
process.exec + process.host |
| 커스텀 액터/스코프로 스폰 | 스폰 권한 + process.security |
에러
| 조건 | 종류 |
|---|---|
| 컨텍스트를 찾을 수 없음 | errors.INVALID |
| 프레임 컨텍스트를 찾을 수 없음 | errors.INVALID |
| 필수 인자 누락 | errors.INVALID |
예약된 토픽 접두사 (@) |
errors.INVALID |
| 잘못된 기간 형식 | errors.INVALID |
| 이름이 등록되지 않음 | errors.NOT_FOUND |
| 권한 거부됨 | errors.PERMISSION_DENIED |
| 이름이 이미 등록됨 | errors.ALREADY_EXISTS |
에러 처리는 에러 처리를 참조하세요.