Aller au contenu

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 :

  1. d'abord, en recevant un signal SIGTERM de cette bibliothèque,
  2. ensuite, après 1 ms, en recevant un signal SIGKILL de 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.