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

local exec = require("exec")

Obtendo um Executor

Obter um recurso de executor de processo pelo ID:

local executor, err = exec.get("app:exec")
if err then
    return nil, err
end

-- Usar executor
local proc = executor:exec("ls -la")
-- ...

-- Liberar quando terminar
executor:release()
Parâmetro Tipo Descrição
id string ID do recurso

Retorna: Executor, error

Criando um Processo

Criar um novo processo com o comando específicado:

-- Comando simples
local proc, err = executor:exec("echo 'Hello, World!'")

-- Com diretorio de trabalho
local proc = executor:exec("npm install", {
    work_dir = "/app/project"
})

-- Com variaveis de ambiente
local proc = executor:exec("python script.py", {
    work_dir = "/scripts",
    env = {
        PYTHONPATH = "/app/lib",
        DEBUG = "true",
        API_KEY = api_key
    }
})

-- Executar script shell
local 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

Iniciar o processo e aguardar conclusao.

local proc = executor:exec("./build.sh")

local ok, err = proc:start()
if err then
    return nil, err
end

local exit_code, err = proc:wait()
if err then
    return nil, err
end

if exit_code ~= 0 then
    return nil, errors.new("INTERNAL", "Build falhou com código de saida: " .. exit_code)
end

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 stdout
local output = {}
while true do
    local chunk = stdout:read(4096)
    if not chunk then break end
    table.insert(output, chunk)
end
local result = table.concat(output)

-- Verificar erros
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 result

write_stdin

Escrever dados para stdin do processo.

-- Pipe de dados para comando
local proc = executor:exec("sort")
local stdout = proc:stdout_stream()

proc:start()

-- Escrever input
proc:write_stdin("banana\napple\ncherry\n")
proc:write_stdin("")  -- Sinalizar EOF

-- Ler saida ordenada
local sorted = stdout:read()
print(sorted)  -- "apple\nbanana\ncherry\n"

proc:wait()
stdout:close()

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 especifico
local SIGINT = 2
proc:signal(SIGINT)

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

Erros

Condição Tipo Retentável
ID inválido errors.INVALID não
Permissão negada errors.PERMISSION_DENIED 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.