Почему возврат CURL и ошибка (23) Не удалось записать тело?
Он работает нормально как один инструмент:
curl "someURL"
curl -o - "someURL"
но он не работает в конвейере:
curl "someURL" | tr -d '\n'
curl -o - "someURL" | tr -d '\n'
он возвращает:
(23) Failed writing body
В чем проблема в конвейерной работе с выкруткой? Как буферировать весь вывод curl, а затем обрабатывать его?
Ответы
Ответ 1
Это происходит, когда программа с каналами (например, grep) закрывает канал чтения до того, как предыдущая программа завершит запись всей страницы.
В curl "url" | grep -qs foo
, как только grep получит то, что он хочет, он закроет поток чтения из curl. cURL не ожидает этого и испускает ошибку "Failed writing body".
Обходной путь заключается в том, чтобы передать поток через посредническую программу, которая всегда читает всю страницу, прежде чем подавать ее в следующую программу.
например.
curl "url" | tac | tac | grep -qs foo
tac
- простая программа Unix, которая читает всю страницу ввода и меняет порядок строк (поэтому мы запускаем ее дважды). Поскольку он должен прочитать весь ввод, чтобы найти последнюю строку, он ничего не выводит grep, пока cURL не будет закончен. Grep по-прежнему будет закрывать поток чтения, если он имеет то, что он ищет, но он будет влиять только на tac, который не испускает ошибку.
Ответ 2
(Для полноты и будущих поисков)
Вопрос в том, как CURL управляет буфером, буфер отключает выходной поток с опцией -N.
Пример:
curl -s -N "URL" | grep -q Welcome
Ответ 3
Другая возможность, если используется опция -o
(выходной файл) - целевой каталог не существует.
например. если у вас есть -o /tmp/download/abc.txt
и /tmp/download не существует.
Следовательно, убедитесь, что все необходимые каталоги созданы/существуют заранее, используйте опцию --create-dirs
, а также - o
при необходимости.
Ответ 4
Так что это была проблема кодирования. Iconv решает проблему
curl 'http://www.multitran.ru/c/m.exe?CL=1&s=hello&l1=1' | iconv -f windows-1251 | tr -dc '[:print:]' | ...
Ответ 5
Вы можете сделать это вместо использования опции -o
:
curl [url] > [file]
Ответ 6
У меня была такая же ошибка, но по разным причинам. В моем случае у меня был раздел (tmpfs) с размером всего 1 ГБ, и я загружал большой файл, который, наконец, заполнил всю память на этом разделе, и я получил ту же ошибку, что и вы.
Ответ 7
В моем случае на сервере не хватило места на диске.
Проверьте это с помощью df -k .
Я был предупрежден о нехватке дискового пространства, когда я дважды попытался передать по каналу tac
, как описано в одном из других ответов: fooobar.com/questions/102897/.... Он показал мне сообщение об ошибке write error: No space left on device
.
Ответ 8
Я столкнулся с этим сообщением об ошибке при попытке установить кэш-лак в Ubuntu. Поиск в Google привел меня сюда из-за ошибки (23) Failed writing body
, поэтому я опубликовал решение, которое помогло мне.
Обнаружена ошибка при запуске команды от имени пользователя root curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
решение состоит в том, чтобы запустить apt-key add
от имени пользователя root
curl -L https://packagecloud.io/varnishcache/varnish5/gpgkey | apt-key add -
Ответ 9
Для меня это был вопрос разрешения. Запуск Docker вызывается с профилем пользователя, но root - это пользователь внутри контейнера. Решением было сделать запись curl в /tmp, поскольку она имеет разрешение на запись для всех пользователей, а не только для пользователя root.
Я использовал опцию -o.
-o/tmp/file_to_download
Ответ 10
Если вы пытаетесь сделать что-то подобное, например, source <( curl -sS $url )
, и получаете ошибку (23) Failed writing body
, то это потому, что замена процесса не работает в bash 3.2
(по умолчанию для macOS).
Вместо этого вы можете использовать этот обходной путь.
source /dev/stdin <<<"$( curl -sS $url )"