215 votes

Pourquoi cURL renvoie-t-il l'erreur "(23) Failed writing body" ?

Il fonctionne bien en tant qu'outil unique :

curl "someURL"
curl -o - "someURL"

mais ça ne fonctionne pas dans un pipeline :

curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'

il revient :

(23) Failed writing body

Quel est le problème avec le piping de la sortie cURL ? Comment mettre en mémoire tampon la totalité de la sortie cURL et la traiter ensuite ?

153voto

Kaworu Points 126

Cela se produit lorsqu'un programme en pipe (par exemple grep) ferme le pipe de lecture avant que le programme précédent ait fini d'écrire la page entière.

Sur curl "url" | grep -qs foo Dès que grep obtient ce qu'il veut, il ferme le flux de lecture de curl. cURL ne s'y attend pas et émet l'erreur "Failed writing body".

Une solution consiste à faire passer le flux par un programme intermédiaire qui lit toujours la page entière avant de la transmettre au programme suivant.

Par exemple

curl "url" | tac | tac | grep -qs foo

tac est un simple programme Unix qui lit toute la page d'entrée et inverse l'ordre des lignes (nous l'exécutons donc deux fois). Comme il doit lire toute l'entrée pour trouver la dernière ligne, il n'enverra rien à grep tant que cURL n'aura pas terminé. Grep fermera toujours le flux de lecture lorsqu'il aura trouvé ce qu'il cherche, mais cela n'affectera que tac, qui n'émet pas d'erreur.

74voto

user5968839 Points 765

Pour l'exhaustivité et les recherches futures :

C'est une question de comment cURL gère le tampon, le tampon désactive le flux de sortie avec l'option -N.

Exemple : curl -s -N "URL" | grep -q Welcome

51voto

MikeW Points 17

Une autre possibilité, si vous utilisez le -o (fichier de sortie) option - le répertoire de destination n'existe pas.

Par exemple, si vous avez -o /tmp/download/abc.txt et /tmp/download n'existe pas.

Par conséquent, assurez-vous que tous les répertoires requis sont créés/existants au préalable, utilisez la fonction --create-dirs ainsi que l'option - o si nécessaire

13voto

Vous pouvez le faire au lieu d'utiliser -o option :

curl [url] > [file]

13voto

Heliodor Points 480

Le serveur a manqué d'espace disque, dans mon cas.

Vérifiez-le avec df -k .

J'ai été alerté du manque d'espace disque lorsque j'ai essayé de passer par le pipeline. tac deux fois, comme décrit dans l'une des autres réponses : https://stackoverflow.com/a/28879552/336694 . Il m'a montré le message d'erreur write error: No space left on device .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X