shell: Módulo Lua para execuções de comandos de shell do sistema sem bloqueio
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.
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
Para usar esta biblioteca Lua com NGINX, certifique-se de que o nginx-module-lua esteja instalado.
Este documento descreve lua-resty-shell v0.3 lançado em 01 de julho 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
Funções
run
sintaxe: ok, stdout, stderr, reason, status = shell.run(cmd, stdin?, timeout?, max_size?)
contexto: todas as fases que suportam yielding
Executa um comando de shell, cmd, com um stdin opcional.
O argumento cmd pode ser um único valor de string (por exemplo, "echo 'hello, world'") ou uma tabela Lua semelhante a um array (por exemplo, {"echo", "hello, world"}). O primeiro é equivalente a {"/bin/sh", "-c", "echo 'hello, world'"}, mas mais simples e ligeiramente mais rápido.
Quando o argumento stdin é nil ou "", o dispositivo stdin será fechado imediatamente.
O argumento timeout especifica o limite de tempo (em ms) para o tempo limite de leitura de stderr/stdout, tempo limite de escrita de stdin e tempo limite de espera do processo.
O argumento max_size especifica o tamanho máximo permitido para cada fluxo de dados de saída de stdout e stderr. Ao exceder o limite, a função run() interromperá imediatamente a leitura de mais dados do fluxo e retornará uma string de erro no valor de retorno reason: "failed to read stdout: too much data".
Ao terminar com sucesso (com um status de saída zero), ok será true, reason será "exit" e status conterá o status de saída do subprocesso.
Ao terminar anormalmente (status de saída diferente de zero), ok será false, reason será "exit" e status conterá o status de saída do subprocesso.
Ao exceder um limite de tempo ou qualquer outro erro inesperado, ok será nil, e reason será uma string descrevendo o erro.
Quando um limite de tempo é excedido, o subprocesso será encerrado da seguinte forma:
- primeiro, recebendo um sinal
SIGTERMdesta biblioteca, - em seguida, após 1ms, recebendo um sinal
SIGKILLdesta biblioteca.
Observe que os processos filhos do subprocesso (se houver) não serão encerrados. Você pode precisar encerrar esses processos por conta própria.
Quando o subprocesso é encerrado por um sinal UNIX, o valor de retorno reason será "signal" e o valor de retorno status conterá o número do sinal.
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-shell.