it-swarm.com.de

ls: wird bei Verwendung von xargs durch Signal 13 beendet

Ich verwende den folgenden Befehl, um vier Dateien mit der größten Größe in einem Ordner zu löschen:

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f

Es funktioniert gut, wirft aber ab und zu einen fehlerhaften Pipe-Fehler:

xargs: ls: terminated by signal 13
21
user1529918

Ich stieß auf ein ähnliches Problem und fand diesen Thread bei der Suche nach einer Antwort:

Signal 13 bedeutet, dass etwas in eine Pipe geschrieben wird, aus der nichts mehr gelesen wird (siehe z. B. http://people.cs.pitt.edu/~alanjawi/cs449/code/Shell/UnixSignals.htm ).

Der Punkt hier ist, dass der ls-Befehl, wie er von xargs ausgeführt wird, immer noch eine Ausgabe schreibt, wenn der folgende Kopfbefehl bereits alle gewünschten Eingaben erhalten hat und seine Eingabepipe geschlossen hat. So ist es sicher zu ignorieren, aber es ist hässlich. Siehe auch die akzeptierte Antwort in https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error

25
planetmaker

Sie beenden Ihr Programm absichtlich mit head -n 4, wodurch die unterbrochene Pipe erstellt wird, weil Sie sie beendet haben, bevor der "Aufrufer" beendet ist. Da dies von Ihnen erwartet wird, können Sie den Fehler ignorieren, indem Sie ihn an /dev/null umleiten, wodurch er verworfen wird:

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f 2>/dev/null

4
David Espart

Ich habe den gleichen Fehler "beendet durch Signal 13" unter anderen Umständen erhalten und andere Antworten haben mir dabei geholfen, das Problem zu lösen. Ich möchte auf die Art des Problems eingehen:

corpy386 ~/gw/Release/5.1_v9/ClaimCenter $ find . -name '*.pcf' -not -name '*build*' | xargs grep -l ClaimSnapshotGeneralPanelSet | ( read f && echo $f && grep 'def=' $f )
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
xargs: grep: terminated by signal 13

Hier ist also der gleiche Fehler und ich würde nur eine einzige Zeile der Ausgabe erhalten, wenn ich wusste, dass es zahlreiche Dateien gibt, die zu meinen Suchkriterien passen. Das Problem war, dass xargs mehrere Ausgabezeilen erzeugt und read vor dem Beenden nur eine einzige Zeile verbraucht. xargs versucht, die restlichen Ergebnisse in eine der Pipes zu schreiben, aber das empfangende Ende ist bereits beendet und nach Hause gegangen. Daher Signal 13: Broken Pipe.

Das Update bestand darin, die gesamte Ausgabe von xargs zu verbrauchen, indem der Schleifenwechsel read f && do_some_things (der nur einmal gelesen wird) in while read f; do do_some_things; done geändert wird.

corpy386 ~/gw/Release/5.1_v9/ClaimCenter $ **find . -name '*.pcf' -not -name '*build*' | xargs grep -l ClaimSnapshotGeneralPanelSet | while read f; do echo $f; grep 'def=' $f; done**
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.gl.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Pr.pcf
      def="ClaimSnapshotGeneralPRPanelSet(Claim, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Trav.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.wc.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotLossDetailsScreen.default.pcf
      def="ClaimSnapshotGeneralPanelSet(Claim, SnapshotParam)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.gl.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Pr.pcf
      def="ClaimSnapshotGeneralPRPanelSet(Claim, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Trav.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.wc.pcf
          def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotLossDetailsScreen.default.pcf
      def="ClaimSnapshotGeneralPanelSet(Claim, SnapshotParam)"

Dies ist nicht genau die gleiche Situation wie bei OPs Skript. Sie wollten einen Teil der Eingabe und sie absichtlich abschneiden, ich wollte den gesamten Stream und ihn aus Versehen abschneiden - aber die Shell-Semantik funktioniert genauso. Programme werden in der Regel so geschrieben, dass sie weiter ausgeführt werden bis sie alle ihre Eingaben verbraucht haben anstatt zu testen, ob der Empfänger noch zuhört.

0
gws