Frage verhindern, dass XARGs bei einem Fehler beendet werden


Laut der man-Seite wird xargs beendet, wenn eine der Ausführungszeilen mit einem Fehler von 255 beendet wird:

Wenn ein Aufruf des Befehls mit dem Status 255 beendet wird, wird xargs sofort gestoppt, ohne weitere Eingaben zu lesen. In diesem Fall wird eine Fehlermeldung an stderr ausgegeben.

Wie kann ich XARGs bekommen? nicht mach das?

Ich habe einen Batch-Job mit 1500 Zeilen, den ich ausführen möchte, 50 Zeilen gleichzeitig. Ich stellte fest, dass es immer an einer bestimmten Linie starb und den Job nicht abschloss. Nicht gut!

Eine noch bessere Frage, die Frage, die beschreibt, was ich zu tun versuche, ist:

Wie kann ich ein 1500-Zeilen-Batch-Skript mit jeweils 50 Zeilen ausführen, so dass der Auftrag nicht in der Mitte beendet wird und die Ausgabe in einer Protokolldatei erfasst wird?


21
2017-07-11 15:56


Ursprung




Antworten:


Sie könnten das Perl-Skript mit einem anderen einfachen Bash-Skript umschließen:

#!/bin/bash
real-command "$@" || exit 0

Dies wird angerufen echter Befehl übergeben Sie alle Parameter, die Sie an diese übergeben Fake-Befehl und es wird immer einen 0-Exit-Code zurückgeben (das bedeutet, dass es immer erfolgreich ist) und xargs wird niemals damit aufhören.


7
2017-07-18 08:04





Ähnlich zu larsks antworte aber expliziter:

xargs sh -c "somecommand || true"

14
2018-01-22 00:01





Sie könnten Ihren xargs-Aufruf schreiben, um die Rückkehrcodes Ihrer Befehlszeilen zu maskieren. Mit etwas wie dem Folgenden,xargs wird nie sehen, dass die Exit-Codes zurückkommen Irgendein Befehl:

xargs sh -c "somecommand || :"

6
2017-07-11 16:08



Ich habe eine gute Lösung gefunden: Stellen Sie sicher, dass die verarbeiteten Befehle nicht mit einem 255-Status beendet werden! Weitere Details  Der verarbeitete Befehl ist ein Perl-Skript. Die Funktion Perldie () wurde an mehreren Stellen zum Beenden verwendet, wenn ein kritischer Fehler aufgetreten ist (z. B. konnte keine Verbindung zu einer Datenbank hergestellt werden). Die Datei Die () wird jedoch immer mit dem Fehlerstatus 255 beendet. Die Lösung in diesem Fall bestand darin, die Datei mit einer Kombination von print und exit () zu ersetzen, zusammen mit einem sinnvolleren Fehlercode (in diesem Fall "1"). - JDS


Habe gerade eine lustige Antwort gefunden, obwohl die Nützlichkeit von dem Befehl abhängt, den du ausführen willst.

Wenn Sie xargs verwenden, um im Grunde eine Liste von Befehlen zu erstellen, können Sie dieses Verhalten erzielen, indem Sie xargs sagen, dass sie den Befehl wiederholen sollen, und dann den Befehl bash an bash senden.

Wenn Sie beispielsweise versuchen, eine Liste mit Dingen zu löschen, die möglicherweise nicht vorhanden sind:

# presume this will fail in a similar way to your command
cat things_to_delete | xargs -n1 delete_command_that_might_exit

# instead echo the commands and pipe to bash
cat things_to_delete | xargs -n1 echo delete_command_that_might_exit | bash

Dies funktioniert, weil xargs zum ersten Mal nur echo aufruft, so dass es keine Fehler sehen wird. Dann zweitens, weil das Standardverhalten von bash die Ausführung nach einer fehlgeschlagenen Anweisung fortsetzt.

Um genauer auf meinen Fall einzugehen, habe ich damit eine Reihe alter Anwendungsversionen aus AWS ElasticBeanstalk entfernt:

aws elasticbeanstalk describe-application-versions --application-name myapp |\
jq -r '.ApplicationVersions | sort_by(.DateCreated) | .[0:-10] | .[].VersionLabel' |\
xargs -n1 \
  echo aws elasticbeanstalk delete-application-version \
       --delete-source-bundle --application-name myapp --version-label |\
bash

3
2018-02-10 05:36





Nach den Bauarbeiten für mich:

ls | xargs -I % svn upgrade %

Selbst wenn das svn-Upgrade für einige Elemente fehlgeschlagen ist, wurde der Prozess fortgesetzt


2
2018-06-24 16:29





Wenn du benutzt hast xargs mit find, benutze die -exec Option von find stattdessen:

find . -name '*.log' -exec somecommand {} \;

1
2017-10-23 01:55



Hallo. Ich könnte das verwenden, aber die Option -exec nicht Operationen parallelisiert die Art und Weise mit Xargs kann und tut - JDS
Danke - das wusste ich nicht xargs könnte Befehle parallel ausführen. Cool. Wenn Sie nur die Anzahl der Befehlsaufrufe minimieren möchten, -exec hat ein + Parameter. - Roger Dahl