find - xargs rm
ls: terminado por la seƱal 13 cuando se usa xargs (3)
Encontré un problema similar y encontré este hilo en la búsqueda de una respuesta:
La señal 13 significa que algo se escribe en una tubería donde ya no se lee nada (por ejemplo, consulte http://people.cs.pitt.edu/~alanjawi/cs449/code/shell/UnixSignals.htm ).
El punto aquí es que el comando ls ejecutado por xargs todavía está escribiendo salida cuando el siguiente comando principal ya obtuvo toda la entrada que desea y cerró su canal de entrada. Por lo tanto, es seguro ignorarlo, pero es feo. Consulte también la respuesta aceptada en https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error
Estoy usando el siguiente comando para eliminar cuatro archivos de mayor tamaño en una carpeta:
find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d ''/n'' rm -f
Funciona bien, pero de vez en cuando lanza un error de tubería rota:
xargs: ls: terminated by signal 13
Está terminando deliberadamente su programa con head -n 4
, que crea el conducto roto porque lo terminó antes de que terminara el "llamante". Como usted lo espera, puede ignorar el error redirigiéndolo a /dev/null
que lo descarta:
find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d ''/n'' rm -f 2>/dev/null
Recibí el mismo error, "terminado por la señal 13", en diferentes circunstancias y otras respuestas aquí me ayudaron a resolver el problema. Me gustaría ampliar la naturaleza del problema:
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
Entonces, aquí está el mismo error y solo obtendría una línea de salida cuando sabía que hay numerosos archivos que coinciden con lo que estoy buscando. El problema fue que xargs
está produciendo múltiples líneas de salida y la read
solo consume una sola línea antes de terminar. xargs
intenta escribir el resto de sus resultados en una de las canalizaciones, pero el extremo receptor ya se ha ido y se ha ido a casa. Por lo tanto, señal 13: Tubo roto.
La solución fue consumir toda la salida de read f && do_some_things
haciendo un bucle - cambiar read f && do_some_things
(que se lee solo una vez) para while read f; do do_some_things; done
while read f; do do_some_things; done
while read f; do do_some_things; done
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)"
Esta no es exactamente la misma situación que el guión de OP: querían una parte de la entrada y la cortaron a propósito, yo quería toda la secuencia y la corté por accidente, pero la semántica de la cáscara funciona de la misma manera. Los programas tienden a escribirse para que se sigan ejecutando hasta que hayan consumido toda su información en lugar de probarlos para ver si su destinatario aún está escuchando.