Pular para o conteúdo

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.

local exec = require("exec")

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âmetroTipoDescrição
idstringID do recurso

Retorna: Executor, error

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âmetroTipoDescrição
cmdstringComando para executar
options.work_dirstringDiretorio de trabalho
options.envtableVariaveis de ambiente

Retorna: Process, error

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

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

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()

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)

Operações de exec estao sujeitas a avaliação de política de segurança.

AçãoRecursoDescrição
exec.getID do ExecutorObter um recurso de executor
exec.runComandoExecutar um comando especifico
CondiçãoTipoRetentável
ID inválidoerrors.INVALIDnão
Permissão negadaerrors.INVALIDnão
Processo fechadoerrors.INVALIDnão
Processo não iniciadoerrors.INVALIDnão
Ja iniciadoerrors.INVALIDnão

Veja Error Handling para trabalhar com erros.