Piped Xargs не выполняет команду

788
pro100sanya

Я хочу контролировать nginx access.log на предмет некорректных запросов и уведомлять себя о таких случаях.

Для этого я написал следующую команду:

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

Но это решение не работает по какой-то причине. Если я удаляю последний канал и заканчиваю только grep - я увижу вывод, поскольку файл журнала получит новые записи.

Я не понимаю, почему Xargs не выполняется. То же самое будет, если вы замените sentry-cli на cat или echo.

Не могли бы вы уточнить, почему у меня такое поведение?

1

2 ответа на вопрос

1
pro100sanya

После некоторого дальнейшего исследования я обнаружил, что следующее решение работает: xargs -L 1.

Спасибо за закрытие цикла по вашему вопросу. Можете ли вы добавить предложение, чтобы объяснить, что это делает, и уточнить, является ли это всей командой? fixer1234 7 лет назад 1
Гордон уже обеспечил хорошее объяснение pro100sanya 7 лет назад 0
1
Gordon Davisson

По умолчанию xargsсобирает входные данные до тех пор, пока не получит столько данных, сколько может безопасно передать одному вызову утилиты (в данном случае sentry-cly -m). Это означает, что он будет ждать, пока не увидит большое количество сообщений журнала, а затем запустится sentry-cly -m first message second message third message ... thousandth message .... Чтобы избежать этого, используйте xargs -L1 sentry-cly -m- the -L1заставляет его работать sentry-cly -mдля каждой строки, которую он читает (т.е. для каждого сообщения).

(Точно так же xargs -L2 sentry-cly -mподождет, пока он не получит 2 сообщения, затем запустится sentry-cly -m "firstmessage" "secondmessage", затем подождет следующие два ... Вы можете увидеть это, запустив xargs -L2 echo, а затем набрав в нем строки и наблюдая, когда эхо повторяется.)

Похожие вопросы