Pular para conteúdo

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:

  1. primeiro, recebendo um sinal SIGTERM desta biblioteca,
  2. em seguida, após 1ms, recebendo um sinal SIGKILL desta 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.