ls: terminated by signal 13 bei der Verwendung von xargs
Ich bin mit dem folgenden Befehl löschen Sie die vier größten Größe der Dateien in einem Ordner:
find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f
Es funktioniert gut, aber von Zeit zu Zeit wirft broken pipe-Fehler:
xargs: ls: terminated by signal 13
InformationsquelleAutor der Frage user1529918 | 2015-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lief ich über ein ähnliches Problem und diesen thread gefunden auf der Suche nach einer Antwort:
Signal 13 bedeutet, dass etwas geschrieben wird, um ein Rohr, wo nichts ist zu Lesen von mehr (z.B. siehe http://people.cs.pitt.edu/~alanjawi/cs449/code/shell/UnixSignals.htm ).
Der Punkt hier ist, dass der ls-Befehl als ausgeführt, von xargs ist noch schriftlich ausgegeben, wenn der nachfolgende Kopf-Befehl schon alle-input will es und Schloss seine Eingabe-pipe. So ist es sicher, Sie zu ignorieren, aber es ist hässlich. Siehe auch die akzeptierten Antworten in https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error
InformationsquelleAutor der Antwort planetmaker
Sind Sie absichtlich beenden Sie Ihr Programm mit
head -n 4
werden, wodurch die Pfeife, denn Sie beendet es, bevor der "Anrufer" beendet. Da dies von Ihnen erwartet, Sie können den Fehler ignorieren dass es zu/dev/null
was verwirft es:find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4
| xargs -d '\n' rm -f 2>/dev/null
InformationsquelleAutor der Antwort David Espart
Ich habe den gleichen Fehler, "terminated by signal 13", unter verschiedenen Umständen und anderen Antworten hier, mir geholfen herauszufinden, das Problem beheben. Ich würde gerne erweitern auf die Natur des Problems:
So, hier ist der gleiche Fehler, und ich würde auch nur eine einzige Zeile ausgegeben, wenn ich wusste, dass es zahlreiche Dateien, die mit dem übereinstimmen, was ich Suche. Das problem war, dass
xargs
produziert mehrere Zeilen Ausgaben undread
ist nur der Konsum einer einzigen Zeile vor dem Ende.xargs
versucht den rest zu schreiben, Ihre Ergebnisse auf einem der Rohre, aber der Empfänger hat bereits zu beenden und nach Hause gegangen. Daher werden signal-13: Broken Pipe.Dem fix war zu verbrauchen alle
xargs
's Ausgabe von looping - ändernread f && do_some_things
(die liest nur ein mal) zuwhile read f; do do_some_things; done
.Dies ist nicht genau die gleiche situation wie OP-Skript - Sie wollte ein Teil des input und schneiden Sie es aus Absicht, ich wollte das ganze streamen und schneiden Sie es durch Unfall - aber die Schale Semantik Arbeit die gleiche. Programme neigen dazu geschrieben werden, am laufen zu halten bis Sie verbraucht haben alle Ihre Eingabe eher als test, um zu sehen, ob Ihre Empfänger noch hören.
InformationsquelleAutor der Antwort gws