Piped xargs führt den Befehl nicht aus

868
pro100sanya

Ich möchte nginx access.log auf fehlerhafte Anfragen überwachen und mich über solche Fälle informieren.

Dafür habe ich folgenden Befehl geschrieben:

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

Diese Lösung funktioniert jedoch aus irgendeinem Grund nicht. Wenn ich die letzte Pipe entferne und nur mit grep ende, sehe ich die Ausgabe, da die Protokolldatei neue Datensätze erhält.

Ich verstehe nicht, warum xargs nicht ausgeführt wird. Das Gleiche gilt, wenn Sie Sentry-cli durch cat oder echo ersetzen.

Könnten Sie erklären, warum ich so etwas verhalte?

1

2 Antworten auf die Frage

1
pro100sanya

Nach einigen weiteren Untersuchung fand ich, dass Lösung folgende funktioniert: xargs -L 1.

Vielen Dank, dass Sie die Schleife zu Ihrer Frage geschlossen haben. Kannst du einen Satz hinzufügen, um zu erklären, was das bedeutet, und klären, ob das der gesamte Befehl ist? fixer1234 vor 7 Jahren 1
Gordon hat bereits eine gute Erklärung abgegeben pro100sanya vor 7 Jahren 0
1
Gordon Davisson

Sammelt standardmäßig xargsdie Eingabe, bis sie so viel hat, wie sie glaubt, sie kann sicher an einen einzelnen Aufruf des Dienstprogramms übergeben werden (in diesem Fall sentry-cly -m). Das heißt, es wartet, bis eine große Anzahl von Protokollnachrichten angezeigt wird, und wird dann ausgeführt sentry-cly -m first message second message third message ... thousandth message .... Um dies zu vermeiden, verwenden Sie xargs -L1 sentry-cly -m- die -L1Anweisung, dass sie sentry-cly -mfür jede gelesene Zeile (dh für jede Nachricht) ausgeführt werden soll.

(In ähnlicher Weise xargs -L2 sentry-cly -mwürde warten, bis es 2 Nachrichten erhalten hatte, dann ausführen sentry-cly -m "firstmessage" "secondmessage"und dann auf die nächsten zwei warten ... Sie können dies sehen, indem Sie ausführen xargs -L2 echound dann Zeilen eingeben und beobachten, was wann wiederholt wird.)