Execução de Comandos
Execução de Comandos
Seção intitulada “Execução de Comandos”Execute comandos externos e scripts shell com controle total sobre streams de I/O.
Para configuração de executor, veja Executor.
Carregamento
Seção intitulada “Carregamento”local exec = require("exec")Obtendo um Executor
Seção intitulada “Obtendo um Executor”Obter um recurso de executor de processo pelo ID:
local executor, err = exec.get("app:exec")if err then return nil, errend
-- Usar executorlocal proc = executor:exec("ls -la")-- ...
-- Liberar quando terminarexecutor:release()| Parâmetro | Tipo | Descrição |
|---|---|---|
id | string | ID do recurso |
Retorna: Executor, error
Criando um Processo
Seção intitulada “Criando um Processo”Criar um novo processo com o comando específicado:
-- Comando simpleslocal proc, err = executor:exec("echo 'Hello, World!'")
-- Com diretorio de trabalholocal proc = executor:exec("npm install", { work_dir = "/app/project"})
-- Com variaveis de ambientelocal proc = executor:exec("python script.py", { work_dir = "/scripts", env = { PYTHONPATH = "/app/lib", DEBUG = "true", API_KEY = api_key }})
-- Executar script shelllocal proc = executor:exec("./deploy.sh production", { work_dir = "/app/scripts", env = { DEPLOY_ENV = "production" }})| Parâmetro | Tipo | Descrição |
|---|---|---|
cmd | string | Comando para executar |
options.work_dir | string | Diretorio de trabalho |
options.env | table | Variaveis de ambiente |
Retorna: Process, error
start / wait
Seção intitulada “start / wait”Iniciar o processo e aguardar conclusao.
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 falhou com código de saida: " .. exit_code)endstdout_stream / stderr_stream
Seção intitulada “stdout_stream / stderr_stream”Obter streams para ler saida do processo.
local proc = executor:exec("./process-data.sh")
local stdout = proc:stdout_stream()local stderr = proc:stderr_stream()
proc:start()
-- Ler todo stdoutlocal output = {}while true do local chunk = stdout:read(4096) if not chunk then break end table.insert(output, chunk)endlocal result = table.concat(output)
-- Verificar erroslocal 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
Seção intitulada “write_stdin”Escrever dados para stdin do processo.
-- Pipe de dados para comandolocal proc = executor:exec("sort")local stdout = proc:stdout_stream()
proc:start()
-- Escrever inputproc:write_stdin("banana\napple\ncherry\n")proc:write_stdin("") -- Sinalizar EOF
-- Ler saida ordenadalocal sorted = stdout:read()print(sorted) -- "apple\nbanana\ncherry\n"
proc:wait()stdout:close()signal / close
Seção intitulada “signal / close”Enviar sinais ou fechar o processo.
local proc = executor:exec("./long-running-server.sh")proc:start()
-- ... depois, precisa parar ...
-- Shutdown gracioso (SIGTERM)proc:close()
-- Ou force kill (SIGKILL)proc:close(true)
-- Ou enviar sinal especificolocal SIGINT = 2proc:signal(SIGINT)Permissões
Seção intitulada “Permissões”Operações de exec estao sujeitas a avaliação de política de segurança.
| Ação | Recurso | Descrição |
|---|---|---|
exec.get | ID do Executor | Obter um recurso de executor |
exec.run | Comando | Executar um comando especifico |
| Condição | Tipo | Retentável |
|---|---|---|
| ID inválido | errors.INVALID | não |
| Permissão negada | errors.INVALID | não |
| Processo fechado | errors.INVALID | não |
| Processo não iniciado | errors.INVALID | não |
| Ja iniciado | errors.INVALID | não |
Veja Error Handling para trabalhar com erros.