shell: module Lua pour l'exécution non bloquante de commandes système
Installation
Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.
CentOS/RHEL 7 ou 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
Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.
Ce document décrit lua-resty-shell v0.3 publié le 1er juillet 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
Fonctions
run
syntax: ok, stdout, stderr, reason, status = shell.run(cmd, stdin?, timeout?, max_size?)
context: toutes les phases supportant le yield
Exécute une commande shell, cmd, avec un stdin optionnel.
L'argument cmd peut être soit une seule valeur de chaîne (par exemple, "echo 'hello, world'") soit un tableau Lua de type tableau (par exemple, {"echo", "hello, world"}). Le premier est équivalent à {"/bin/sh", "-c", "echo 'hello, world'"}, mais plus simple et légèrement plus rapide.
Lorsque l'argument stdin est nil ou "", le périphérique stdin sera immédiatement fermé.
L'argument timeout spécifie le seuil de délai d'attente (en ms) pour le délai d'attente de lecture stderr/stdout, le délai d'attente d'écriture stdin et le délai d'attente d'attente du processus.
L'argument max_size spécifie la taille maximale autorisée pour chaque flux de données de sortie de stdout et stderr. En cas de dépassement de la limite, la fonction run() arrêtera immédiatement de lire plus de données du flux et renverra une chaîne d'erreur dans la valeur de retour reason : "failed to read stdout: too much data".
Lors d'une terminaison réussie (avec un statut de sortie zéro), ok sera true, reason sera "exit" et status contiendra le statut de sortie du sous-processus.
Lors d'une terminaison anormale (statut de sortie non zéro), ok sera false, reason sera "exit" et status contiendra le statut de sortie du sous-processus.
En cas de dépassement d'un seuil de délai d'attente ou d'une autre erreur inattendue, ok sera nil, et reason sera une chaîne décrivant l'erreur.
Lorsqu'un seuil de délai d'attente est dépassé, le sous-processus sera terminé comme suit :
- d'abord, en recevant un signal
SIGTERMde cette bibliothèque, - ensuite, après 1 ms, en recevant un signal
SIGKILLde cette bibliothèque.
Notez que les processus enfants du sous-processus (le cas échéant) ne seront pas terminés. Vous devrez peut-être terminer ces processus vous-même.
Lorsque le sous-processus est terminé par un signal UNIX, la valeur de retour reason sera "signal" et la valeur de retour status contiendra le numéro du signal.
GitHub
Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-shell.