GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum kann Xargs nicht mit Tail -f arbeiten?

Ich möchte tail -f /var/log/syslog | grep es mit dem Muster „arpwatch“ und sende jede Zeile per Jabber an mich selbst:xmpp [email protected] Verwenden von xargs

tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]

funktioniert nicht.

aber tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]

funktioniert gut.

Ich denke, es ist eine grundlegende Sache bei xargs und tail -f das verstehe ich nicht.

Akzeptierte Antwort:

xargs command versucht, so viele Eingabeelemente (Zeilen, Wörter) wie möglich zu einem Aufruf des Befehls zu sammeln , und es kümmert sich nicht besonders um das Timing der Eingabedaten. Wenn der tail Prozess wird beendet oder xargs s-Puffer gefüllt wird, wird Befehl ausgeführt mit den bis dahin erhaltenen Argumenten. Allerdings tail -f beendet sich normalerweise nicht von selbst, und das Limit für Befehlszeilenargumente kann groß sein, sodass es den Anschein hat, als würde es überhaupt nicht funktionieren.

Sie könnten xargs -n1 verwenden nur ein Eingabeelement auf einmal an Befehl übergeben , aber Sie werden von der Tatsache getroffen, dass xargs verwendet Leerzeichen, um die Eingabe in Elemente aufzuteilen, also eine Eingabezeile von foo bar würde dazu führen, dass der Befehl zweimal ausgeführt wird.

Mit GNU xargs, xargs -n1 -d '\n' sollte tun, was Sie wollen:Führen Sie Befehl aus einmal für jede Eingabezeile, wobei die vollständige Zeile als einzelnes Argument übergeben wird.

Versuchen Sie z. mit und ohne -d und -n und notieren Sie sich das Ausgabetiming:

$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'

xargs -L 1 würde auch funktionieren, aber es wird die Zeile immer noch in separate Argumente aufteilen, anstatt die ganze Zeile als ein Argument zu übergeben.


Linux
  1. Warum funktioniert die Bash-Prozesssubstitution bei einigen Befehlen nicht?

  2. Warum kann `su` nicht verwendet werden, um zu Benutzern mit leerem Passwort zu wechseln?

  3. Warum kann ich mich mit Teilpasswörtern anmelden?

  4. Warum funktioniert `exit &` nicht?

  5. Warum funktioniert Tomcat mit Port 8080, aber nicht mit 80?

Linux-Tail-Befehl mit Beispielen

Ich erneuere meinen Nervenkitzel bei der Arbeit mit Ansible

So arbeiten Sie mit Ansible Provisioner in Vagrant

Arbeiten Sie mit der Wiederherstellung auf Dateiebene

Arbeiten Sie mit ZIP-Dateien unter Linux

Zeile für Zeile im Bash-Skript lesen