Перейти к содержанию

shell: Lua модуль для неблокирующих выполнений системных команд оболочки

Установка

Если вы еще не настроили подписку на репозиторий RPM, зарегистрируйтесь. Затем вы можете перейти к следующим шагам.

CentOS/RHEL 7 или 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

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что установлен nginx-module-lua.

Этот документ описывает lua-resty-shell v0.3, выпущенный 1 июля 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

Функции

run

синтаксис: ok, stdout, stderr, reason, status = shell.run(cmd, stdin?, timeout?, max_size?)

контекст: все фазы, поддерживающие приостановку

Запускает команду оболочки, cmd, с необязательным stdin.

Аргумент cmd может быть либо одной строкой (например, "echo 'hello, world'"), либо таблицей Lua, похожей на массив (например, {"echo", "hello, world"}). Первый вариант эквивалентен {"/bin/sh", "-c", "echo 'hello, world'"}, но проще и немного быстрее.

Когда аргумент stdin равен nil или "", устройство stdin будет немедленно закрыто.

Аргумент timeout указывает порог времени ожидания (в мс) для таймаута чтения stderr/stdout, таймаута записи в stdin и таймаута ожидания процесса.

Аргумент max_size указывает максимальный размер, разрешенный для каждого потока данных вывода stdout и stderr. При превышении лимита функция run() немедленно прекратит чтение любых дополнительных данных из потока и вернет строку ошибки в значении reason: "failed to read stdout: too much data".

При успешном завершении (с нулевым кодом выхода) ok будет равно true, reason будет равно "exit", а status будет содержать код выхода подпроцесса.

При ненормальном завершении (не нулевой код выхода) ok будет равно false, reason будет равно "exit", а status будет содержать код выхода подпроцесса.

При превышении порога времени ожидания или любой другой неожиданной ошибке ok будет равно nil, а reason будет строкой, описывающей ошибку.

Когда превышен порог времени ожидания, подпроцесс будет завершен следующим образом:

  1. сначала, получив сигнал SIGTERM от этой библиотеки,
  2. затем, через 1 мс, получив сигнал SIGKILL от этой библиотеки.

Обратите внимание, что дочерние процессы подпроцесса (если таковые имеются) не будут завершены. Вам может потребоваться завершить эти процессы самостоятельно.

Когда подпроцесс завершается сигналом UNIX, значение reason будет равно "signal", а значение status будет содержать номер сигнала.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-shell.