Saltar a contenido

shell: módulo Lua para ejecuciones de comandos del sistema sin bloqueo

Instalación

Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.

CentOS/RHEL 7 o Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-shell

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-shell

Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.

Este documento describe lua-resty-shell v0.3 lanzado el 01 de julio de 2020.


local shell = require "resty.shell"

local stdin = "hello"
local timeout = 1000  -- ms
local max_size = 4096  -- byte

local ok, stdout, stderr, reason, status =
    shell.run([[perl -e 'warn "he\n"; print <>']], stdin, timeout, max_size)
if not ok then
    -- ...
end

Funciones

run

sintaxis: ok, stdout, stderr, reason, status = shell.run(cmd, stdin?, timeout?, max_size?)

contexto: todas las fases que soportan yielding

Ejecuta un comando de shell, cmd, con un stdin opcional.

El argumento cmd puede ser un único valor de cadena (por ejemplo, "echo 'hello, world'") o una tabla de Lua similar a un array (por ejemplo, {"echo", "hello, world"}). El primero es equivalente a {"/bin/sh", "-c", "echo 'hello, world'"}, pero más simple y ligeramente más rápido.

Cuando el argumento stdin es nil o "", el dispositivo stdin se cerrará inmediatamente.

El argumento timeout especifica el umbral de tiempo de espera (en ms) para el tiempo de espera de lectura de stderr/stdout, el tiempo de espera de escritura de stdin y el tiempo de espera de espera del proceso.

El argumento max_size especifica el tamaño máximo permitido para cada flujo de datos de salida de stdout y stderr. Al exceder el límite, la función run() detendrá inmediatamente la lectura de más datos del flujo y devolverá una cadena de error en el valor de retorno reason: "failed to read stdout: too much data".

Al terminar con éxito (con un estado de salida cero), ok será true, reason será "exit", y status contendrá el estado de salida del subproceso.

Al terminar de manera anormal (estado de salida no cero), ok será false, reason será "exit", y status contendrá el estado de salida del subproceso.

Al exceder un umbral de tiempo de espera o cualquier otro error inesperado, ok será nil, y reason será una cadena que describe el error.

Cuando se excede un umbral de tiempo de espera, el subproceso se terminará de la siguiente manera:

  1. primero, recibiendo una señal SIGTERM de esta biblioteca,
  2. luego, después de 1ms, recibiendo una señal SIGKILL de esta biblioteca.

Ten en cuenta que los procesos secundarios del subproceso (si los hay) no serán terminados. Es posible que necesites terminar estos procesos tú mismo.

Cuando el subproceso es terminado por una señal UNIX, el valor de retorno reason será "signal" y el valor de retorno status contendrá el número de señal.

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-shell.