Ejecución de Comandos
Ejecución de Comandos
Sección titulada «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")Adquirir un Ejecutor
Sección titulada «Adquirir un Ejecutor»Obtener un recurso de ejecutor de procesos por ID:
local executor, err = exec.get("app:exec")if err then return nil, errend
-- Usar ejecutorlocal proc = executor:exec("ls -la")-- ...
-- Liberar cuando termineexecutor:release()| Parámetro | Tipo | Descripción |
|---|---|---|
id | string | ID de recurso |
Devuelve: Executor, error
Crear un Proceso
Sección titulada «Crear un Proceso»Crear un nuevo proceso con el comando especificado:
-- Comando simplelocal proc, err = executor:exec("echo 'Hello, World!'")
-- Con directorio de trabajolocal proc = executor:exec("npm install", { work_dir = "/app/project"})
-- Con variables de entornolocal proc = executor:exec("python script.py", { work_dir = "/scripts", env = { PYTHONPATH = "/app/lib", DEBUG = "true", API_KEY = api_key }})
-- Ejecutar script de shelllocal proc = executor:exec("./deploy.sh production", { work_dir = "/app/scripts", env = { DEPLOY_ENV = "production" }})| Parámetro | Tipo | Descripción |
|---|---|---|
cmd | string | Comando a ejecutar |
options.work_dir | string | Directorio de trabajo |
options.env | table | Variables de entorno |
Devuelve: Process, error
start / wait
Sección titulada «start / wait»Iniciar el proceso y esperar a que complete.
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
Sección titulada «stdout_stream / stderr_stream»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 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 erroreslocal 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
Sección titulada «write_stdin»Escribir datos a stdin del proceso.
-- Canalizar datos a comandolocal proc = executor:exec("sort")local stdout = proc:stdout_stream()
proc:start()
-- Escribir entradaproc:write_stdin("banana\napple\ncherry\n")proc:write_stdin("") -- Senalar EOF
-- Leer salida ordenadalocal sorted = stdout:read()print(sorted) -- "apple\nbanana\ncherry\n"
proc:wait()stdout:close()signal / close
Sección titulada «signal / 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 especificalocal SIGINT = 2proc:signal(SIGINT)Permisos
Sección titulada «Permisos»Las operaciones de exec estan sujetas a evaluacion de politica de seguridad.
| Accion | Recurso | Descripción |
|---|---|---|
exec.get | ID de Executor | Adquirir un recurso ejecutor |
exec.run | Command | Ejecutar un comando específico |
Errores
Sección titulada «Errores»| Condición | Tipo | Reintentable |
|---|---|---|
| ID invalido | errors.INVALID | no |
| Permiso denegado | errors.INVALID | no |
| Proceso cerrado | errors.INVALID | no |
| Proceso no iniciado | errors.INVALID | no |
| Ya iniciado | errors.INVALID | no |
Consulte Manejo de Errores para trabajar con errores.