macos - ¿Por qué CURL return and error(23) Falló la escritura del cuerpo?
bash osx-lion (8)
Encontré este mensaje de error al intentar instalar caché de barniz en ubuntu. La búsqueda en google me llevó aquí por el error
(23) Failed writing body, por lo tanto, publicando una solución que funcionó para mí.
El error se encuentra al ejecutar el comando como root curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add - curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
la solución es ejecutar apt-key add como no root
curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
Funciona bien como una herramienta única:
curl "someURL"
curl -o - "someURL"
pero no funciona en una tubería:
curl "someURL" | tr -d ''/n''
curl -o - "someURL" | tr -d ''/n''
vuelve:
(23) Failed writing body
¿Cuál es el problema en la tubería de la salida de curl? ¿Cómo almacenar en búfer todo el curl de salida y luego manejarlo?
(Para compleción y búsquedas futuras) Es una cuestión de cómo CURL administra el búfer, el búfer desactiva el flujo de salida con la opción -N.
ES: curl -s -N "URL" | grep -q Welcome curl -s -N "URL" | grep -q Welcome
El servidor se quedó sin espacio en disco, en mi caso.
Compruébalo con df -k .
Me alertaron de la falta de espacio en el disco cuando intenté conectarme a través de tac dos veces, como se describe en una de las otras respuestas: https://.com/a/28879552/336694 . Me mostró el error de write error: No space left on device mensaje de write error: No space left on device .
Entonces fue un problema de codificación. Iconv resuelve el problema
curl ''http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1'' | iconv -f windows-1251 | tr -dc ''[:print:]'' | ...
Esto sucede cuando un programa canalizado (por ejemplo, grep) cierra el conducto de lectura antes de que el programa anterior termine de escribir toda la página.
En curl "url" | grep -qs foo curl "url" | grep -qs foo , tan pronto como grep tenga lo que quiere, cerrará la secuencia de lectura del curl. cURL no espera esto y emite el error "Error al escribir el cuerpo".
Una solución es canalizar la transmisión a través de un programa intermediario que siempre lee toda la página antes de pasarla al siguiente programa.
P.ej
curl "url" | tac | tac | grep -qs foo
tac es un programa simple de Unix que lee toda la página de entrada e invierte el orden de las líneas (por lo tanto, lo ejecutamos dos veces). Debido a que tiene que leer toda la entrada para encontrar la última línea, no dará salida a grep hasta que termine cURL. Grep aún cerrará la secuencia de lectura cuando tenga lo que está buscando, pero solo afectará a tac, que no emite un error.
Otra posibilidad, si se usa la opción -o (archivo de salida), el directorio de destino no existe.
p.ej. si tiene -o /tmp/download/abc.txt y / tmp / download no existe.
Por lo tanto, asegúrese de que los directorios necesarios se creen / existan de antemano, use la opción --create-dirs así como también - o si es necesario
Puede hacer esto en lugar de usar la opción -o :
curl [url] > [file]
Tuve el mismo error pero por diferentes motivos. En mi caso tenía una partición (tmpfs) con solo 1GB de espacio y estaba descargando un archivo grande que finalmente llenó toda la memoria en esa partición y obtuve el mismo error que tú.