Zum Inhalt

shell: Lua-Modul für nicht blockierende Ausführungen von System-Shell-Befehlen

Installation

Wenn Sie das RPM-Repository-Abonnement noch nicht eingerichtet haben, melden Sie sich an. Danach können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder 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

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-shell v0.3, das am 01. Juli 2020 veröffentlicht wurde.


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

Funktionen

run

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

context: alle Phasen, die Yielding unterstützen

Führt einen Shell-Befehl, cmd, mit optionalem stdin aus.

Das Argument cmd kann entweder ein einzelner String-Wert (z.B. "echo 'hello, world'") oder eine array-ähnliche Lua-Tabelle (z.B. {"echo", "hello, world"}) sein. Letzteres ist äquivalent zu {"/bin/sh", "-c", "echo 'hello, world'"}, jedoch einfacher und etwas schneller.

Wenn das Argument stdin nil oder "" ist, wird das stdin-Gerät sofort geschlossen.

Das Argument timeout gibt die Zeitüberschreitungsgrenze (in ms) für die Zeitüberschreitung beim Lesen von stderr/stdout, beim Schreiben von stdin und beim Warten auf den Prozess an.

Das Argument max_size gibt die maximale Größe an, die für jeden Ausgabedatenstrom von stdout und stderr zulässig ist. Bei Überschreitung des Limits stoppt die Funktion run() sofort das Lesen weiterer Daten aus dem Stream und gibt eine Fehlermeldung im Rückgabewert reason zurück: "failed to read stdout: too much data".

Bei erfolgreichem Abschluss (mit einem Exit-Status von null) wird ok true sein, reason wird "exit" sein, und status wird den Exit-Status des Unterprozesses enthalten.

Bei abnormalem Abschluss (nicht null Exit-Status) wird ok false sein, reason wird "exit" sein, und status wird den Exit-Status des Unterprozesses enthalten.

Bei Überschreitung einer Zeitüberschreitungsgrenze oder einem anderen unerwarteten Fehler wird ok nil sein, und reason wird eine Zeichenfolge sein, die den Fehler beschreibt.

Wenn eine Zeitüberschreitungsgrenze überschritten wird, wird der Unterprozess wie folgt beendet:

  1. Zuerst durch den Empfang eines SIGTERM-Signals von dieser Bibliothek,
  2. Dann, nach 1 ms, durch den Empfang eines SIGKILL-Signals von dieser Bibliothek.

Beachten Sie, dass Kindprozesse des Unterprozesses (sofern vorhanden) nicht beendet werden. Möglicherweise müssen Sie diese Prozesse selbst beenden.

Wenn der Unterprozess durch ein UNIX-Signal beendet wird, wird der Rückgabewert reason "signal" sein und der Rückgabewert status wird die Signalnummer enthalten.

GitHub

Sie finden möglicherweise zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-shell.