Pipar xargs não executa o comando

1

Eu quero monitorar o acesso nginx.log para solicitações malformadas e me notificar sobre esses casos.

Para fazer isso, escrevi o seguinte comando:

tail -n0 -f access.log | grep --line-buffered '\{' | xargs sentry-cly -m

Mas esta solução não funciona por algum motivo. Se eu remover o último pipe e terminar com apenas o grep - verei a saída como arquivo de log obter novos registros.

Eu não entendo porque os xargs não são executados. Será o mesmo se você substituir sentry-cli por cat ou echo.

Você poderia esclarecer por que eu tenho tal comportamento?

    
por pro100sanya 10.12.2016 / 21:24

2 respostas

1

Por padrão, xargs coleta a entrada até que tenha o máximo possível de segurança para passar para uma única invocação do utilitário (nesse caso, sentry-cly -m ). Isso significa que ele esperará até que seja visto um grande número de mensagens de log e, em seguida, execute sentry-cly -m first message second message third message ... thousandth message ... . Para evitar isso, use xargs -L1 sentry-cly -m - o -L1 diz para executar sentry-cly -m para cada linha que lê (por exemplo, para cada mensagem).

(Da mesma forma, xargs -L2 sentry-cly -m esperaria até receber 2 mensagens, em seguida, executar sentry-cly -m "firstmessage" "secondmessage" , depois aguardar as próximas duas ... Você pode ver isso executando xargs -L2 echo e digitando linhas nele e observando o que é ecoado quando.)

    
por 10.12.2016 / 23:40
1

Após algumas investigações posteriores, descobri que seguir a solução funciona: xargs -L 1 .

    
por 10.12.2016 / 22:42