명령 실행
명령 실행
섹션 제목: “명령 실행”I/O 스트림에 대한 완전한 제어와 함께 외부 명령과 셸 스크립트를 실행합니다.
실행기 설정은 실행기를 참조하세요.
local exec = require("exec")실행기 획득
섹션 제목: “실행기 획득”ID로 프로세스 실행기 리소스를 가져옵니다:
local executor, err = exec.get("app:exec")if err then return nil, errend
-- 실행기 사용local proc = executor:exec("ls -la")-- ...
-- 완료 시 해제executor:release()| 파라미터 | 타입 | 설명 |
|---|---|---|
id | string | 리소스 ID |
반환: Executor, error
프로세스 생성
섹션 제목: “프로세스 생성”지정된 명령으로 새 프로세스를 생성합니다:
-- 단순 명령local proc, err = executor:exec("echo 'Hello, World!'")
-- 작업 디렉토리 지정local proc = executor:exec("npm install", { work_dir = "/app/project"})
-- 환경 변수 지정local proc = executor:exec("python script.py", { work_dir = "/scripts", env = { PYTHONPATH = "/app/lib", DEBUG = "true", API_KEY = api_key }})
-- 셸 스크립트 실행local proc = executor:exec("./deploy.sh production", { work_dir = "/app/scripts", env = { DEPLOY_ENV = "production" }})| 파라미터 | 타입 | 설명 |
|---|---|---|
cmd | string | 실행할 명령 |
options.work_dir | string | 작업 디렉토리 |
options.env | table | 환경 변수 |
반환: Process, error
start / wait
섹션 제목: “start / wait”프로세스를 시작하고 완료를 기다립니다.
local proc = executor:exec("./build.sh")
local ok, err = proc:start()if err then return nil, errend
local exit_code, err = proc:wait()if err then return nil, errend
if exit_code ~= 0 then return nil, errors.new("INTERNAL", "Build failed with exit code: " .. exit_code)endstdout_stream / stderr_stream
섹션 제목: “stdout_stream / stderr_stream”프로세스 출력을 읽기 위한 스트림을 가져옵니다.
local proc = executor:exec("./process-data.sh")
local stdout = proc:stdout_stream()local stderr = proc:stderr_stream()
proc:start()
-- 모든 stdout 읽기local output = {}while true do local chunk = stdout:read(4096) if not chunk then break end table.insert(output, chunk)endlocal result = table.concat(output)
-- 에러 확인local err_output = {}while true do local chunk = stderr:read(4096) if not chunk then break end table.insert(err_output, chunk)end
local exit_code = proc:wait()
stdout:close()stderr:close()
if exit_code ~= 0 then return nil, errors.new("INTERNAL", table.concat(err_output))end
return resultwrite_stdin
섹션 제목: “write_stdin”프로세스 stdin에 데이터를 씁니다.
-- 명령으로 데이터 파이프local proc = executor:exec("sort")local stdout = proc:stdout_stream()
proc:start()
-- 입력 쓰기proc:write_stdin("banana\napple\ncherry\n")proc:write_stdin("") -- EOF 신호
-- 정렬된 출력 읽기local sorted = stdout:read()print(sorted) -- "apple\nbanana\ncherry\n"
proc:wait()stdout:close()signal / close
섹션 제목: “signal / close”시그널을 보내거나 프로세스를 닫습니다.
local proc = executor:exec("./long-running-server.sh")proc:start()
-- ... 나중에 중지해야 할 때 ...
-- 정상 종료 (SIGTERM)proc:close()
-- 또는 강제 종료 (SIGKILL)proc:close(true)
-- 또는 특정 시그널 전송local SIGINT = 2proc:signal(SIGINT)실행 작업은 보안 정책 평가 대상입니다.
| 액션 | 리소스 | 설명 |
|---|---|---|
exec.get | 실행기 ID | 실행기 리소스 획득 |
exec.run | 명령 | 특정 명령 실행 |
| 조건 | 종류 | 재시도 가능 |
|---|---|---|
| 잘못된 ID | errors.INVALID | 아니오 |
| 권한 거부됨 | errors.INVALID | 아니오 |
| 프로세스 닫힘 | errors.INVALID | 아니오 |
| 프로세스 시작되지 않음 | errors.INVALID | 아니오 |
| 이미 시작됨 | errors.INVALID | 아니오 |
에러 처리는 에러 처리를 참조하세요.