Буфер может опустошиться, или соединения могут быть закрыты, если данные переданы / загружены на сервер.

Давайте назовем эту гипотетическую программу "lb" (большой буфер).

cat data.iso | dvd-writer-app /dev/sr0

Буфер записи DVD может опустошиться, а затем запись DVD не удастся. Однако при использовании нашего приложения "lb":

cat data.iso | lb --keep-buffer 32M | dvd-writer-app /dev/sr0

В этом случае он может предотвратить опустошение, если он зарезервирует 32M буфер внутри.

Иногда я делаю это:

(for $(seq -w 1 10);do wget -q "http://example.com/file.$i";patch_that_file "file.$i";cat "file.$i";rm "file.$i";done)|curl -T - ftp://yaexample.com/big_concatenated_file.bin

Я извлекаю несколько файлов, один за другим, как-то локально исправляю их на диске (что требует случайного поиска, я не могу сделать это во время загрузки), объединяю их вместе, а затем, наконец, загружаю их объединенное содержимое на сервер. Я делаю это, когда у меня мало места на диске для загрузки всех файлов. Поэтому я загружаю их один за другим, исправляю их локально по мере необходимости, и их объединенное содержимое покидает цикл for. Когда файл был обработан, он немедленно удаляется с помощью "rm", чтобы освободить место на диске для следующего, и так далее.

К сожалению, удаленный сервер настроен таким образом, что он закрывает соединение, когда данные не принимаются в течение как минимум 20 секунд. Однако загрузка файла с помощью "wget" занимает некоторое время (1-2 минуты или даже больше на файл), а исправление их также занимает некоторое время (несколько секунд). Это загвоздка, потому что удаленный сервер закрывает соединение между двумя последовательными выборками / исправлениями файлов, если это занимает более 20 секунд.

Если бы у меня был фильтр с именем "lb", который поддерживает достаточно большой внутренний буфер, то я мог бы сделать:

(for $(seq -w 1 10);do wget -q "http://example.com/file.$i";patch_that_file "file.$i";cat "file.$i";rm "file.$i";done) | lb --maxtime $[ 4*60 ] --min-bandwidth 50K | curl -T - ftp://yaexample.com/concatenated_file.bin

Ему сказали бы: зарезервируйте внутренний буфер, которого хватит на 4 * 60 секунд, чтобы обеспечить минимальную пропускную способность не менее 50 КБ / с. Это всего лишь около 12 МБ буфера, пока он не иссякнет, если я сделаю все правильно.

Фильтр должен работать таким образом, чтобы он пропускал и передавал данные с полной полосой пропускания, когда поступающие данные доступны на его стандартном входе (STDIN). Когда он не получает данных на свой STDIN, он должен обратиться к своему внутреннему буферу, который (конечно, постоянно поддерживается) замедляется, и обеспечить только минимальную (здесь 50К) полосу пропускания на своем стандартном выходе (STDOUT). В этом случае удаленный сервер не закроет соединение, и я мог бы загрузить большой файл по порядку.

Существует ли такой фильтр, или я должен написать его для себя на соответствующем языке программирования?

PS: выбор первого файла и предварительная загрузка внутреннего буфера "lb" - не проблема для меня, по крайней мере, в этом конкретном случае, потому что в конце цепочки трубопроводов есть сложное приложение для загрузки, и я могу его изменить начать / открыть соединение сразу после того, как поступающие данные станут доступны.

0