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:
- primero, recibiendo una señal
SIGTERMde esta biblioteca, - luego, después de 1ms, recibiendo una señal
SIGKILLde 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.