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ú.