Ir al contenido

Ejecución de Comandos

Ejecutar comandos externos y scripts de shell con control total sobre streams de E/S.

Para configuración del ejecutor, consulte Ejecutor.

local exec = require("exec")

Obtener un recurso de ejecutor de procesos por ID:

local executor, err = exec.get("app:exec")
if err then
return nil, err
end
-- Usar ejecutor
local proc = executor:exec("ls -la")
-- ...
-- Liberar cuando termine
executor:release()
ParámetroTipoDescripción
idstringID de recurso

Devuelve: Executor, error

Crear un nuevo proceso con el comando especificado:

-- Comando simple
local proc, err = executor:exec("echo 'Hello, World!'")
-- Con directorio de trabajo
local proc = executor:exec("npm install", {
work_dir = "/app/project"
})
-- Con variables de entorno
local proc = executor:exec("python script.py", {
work_dir = "/scripts",
env = {
PYTHONPATH = "/app/lib",
DEBUG = "true",
API_KEY = api_key
}
})
-- Ejecutar script de shell
local proc = executor:exec("./deploy.sh production", {
work_dir = "/app/scripts",
env = {
DEPLOY_ENV = "production"
}
})
ParámetroTipoDescripción
cmdstringComando a ejecutar
options.work_dirstringDirectorio de trabajo
options.envtableVariables de entorno

Devuelve: Process, error

Iniciar el proceso y esperar a que complete.

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 failed with exit code: " .. exit_code)
end

Obtener streams para leer salida del proceso.

local proc = executor:exec("./process-data.sh")
local stdout = proc:stdout_stream()
local stderr = proc:stderr_stream()
proc:start()
-- Leer 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 errores
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

Escribir datos a stdin del proceso.

-- Canalizar datos a comando
local proc = executor:exec("sort")
local stdout = proc:stdout_stream()
proc:start()
-- Escribir entrada
proc:write_stdin("banana\napple\ncherry\n")
proc:write_stdin("") -- Senalar EOF
-- Leer salida ordenada
local sorted = stdout:read()
print(sorted) -- "apple\nbanana\ncherry\n"
proc:wait()
stdout:close()

Enviar senales o cerrar el proceso.

local proc = executor:exec("./long-running-server.sh")
proc:start()
-- ... despues, necesita detenerlo ...
-- Apagado graceful (SIGTERM)
proc:close()
-- O forzar kill (SIGKILL)
proc:close(true)
-- O enviar senal especifica
local SIGINT = 2
proc:signal(SIGINT)

Las operaciones de exec estan sujetas a evaluacion de politica de seguridad.

AccionRecursoDescripción
exec.getID de ExecutorAdquirir un recurso ejecutor
exec.runCommandEjecutar un comando específico
CondiciónTipoReintentable
ID invalidoerrors.INVALIDno
Permiso denegadoerrors.INVALIDno
Proceso cerradoerrors.INVALIDno
Proceso no iniciadoerrors.INVALIDno
Ya iniciadoerrors.INVALIDno

Consulte Manejo de Errores para trabajar con errores.