管道 xargs 不执行命令

管道 xargs 不执行命令

我想要监控 nginx access.log 中是否存在格式错误的请求,并在出现此类情况时通知自己。

为此我写了以下命令:

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

但出于某些原因,此解决方案不起作用。如果我删除最后一个管道并仅以 grep 结尾 - 我将看到输出为日志文件获取新记录。

不明白为什么 xargs 没有执行,如果将 sentry-cli 替换为 cat 或者 echo 也是一样的。

你能解释一下我为什么会有这样的行为吗?

答案1

默认情况下,xargs收集输入,直到它认为可以安全地传递给实用程序的一次调用(在本例中为sentry-cly -m)。这意味着它会等到看到大量日志消息后才运行sentry-cly -m first message second message third message ... thousandth message ...。为了避免这种情况,使用xargs -L1 sentry-cly -m--告诉它对读取的每一行(即每条消息)-L1运行。sentry-cly -m

(类似地,xargs -L2 sentry-cly -m会等到它收到 2 条消息然后运行sentry-cly -m "firstmessage" "secondmessage",然后等待接下来的两条消息...您可以通过运行xargs -L2 echo然后在其中输入行并观察何时回显什么来看到这一点。)

答案2

经过进一步调查后,我发现以下解决方案有效: xargs -L 1

相关内容