tar | netcat для большого количества файлов

Oct 09, 2019 23:10


Вспомним классический способ переноса папки с файлами с одного хоста на другой.
На передатчике:
tar -cf - some_folder | nc 192.168.1.1 1234

На приемнике:
nc -w 10 -l -p 1234 | tar -xf -

Все смеются, все счастливы.

Но теперь угораздило нас передавать не папочку, а список файлов. Причем, список весьма жирный. Пару миллионов штук. Поимённо. Пытаемся сделать по аналогии.
На передатчике:
xargs -r -0 -a big.file.list tar -cf - | nc 192.168.1.1 1234

На приемнике:
nc -w 10 -l -p 1234 | tar -xf -

И внезапно обнаруживаем, что так не работает. Кто сходу сообразит почему, не читая дальше, тот молодец.
[Если не сообразил, ответ здесь]Правильно, потому что xargs на отправителе будет периодически перезапускать tar с новым списком аргументов. Как только это произойдёт, tar на приёмнике завершит свою работу. А вместе с ним закончится и принимающий netcat. В свою очередь, перезапущенному на отправителе tar-у будет уже некуда сливать свои данные, поскольку сетевой транспорт к этому моменту благополучно развалился.
Но что же делать? Как быть? Очевидно,
[что]что потребуется перезапускать принимающий софт. Но как именно? Есть два варианта: всю связку "tar+netcat" или один только отдельно взятый tar.
Первый вариант плох тем, что принимающая сторона не успеет сделать это достаточно быстро. А передающей пофиг, она резкая как понос. Поэтому либо всё равно линк развалится, либо придется вставлять задержку а-ля "sleep 1" между попытками установки связи на передатчике, либо использовать постоянный инкремент номера порта. Шо то фигня, шо это фигня.

Второй вариант более привлекателен, но для его реализации потребуется немного извратиться с именованными каналами. Примерно так.
На передатчике:
mkfifo my.fifo
nc -q 10 192.168.1.1 1234 < my.fifo &
PID=$!
xargs -r -0 -a big.file.list tar -cf - >> my.fifo
wait $PID
rm my.fifo

На приемнике:
mkfifo my.fifo
nc -w 10 -l -p 1234 > my.fifo &
PID=$!
while true ; do
kill -0 $PID 2>/dev/null || break
tar -xf -
done < my.fifo
rm my.fifo

Такие дела. Не каждый дурак может закончить военную академию, а ведь я её кончил! © Только не спрашивайте пожалуйста зачем мне всё это нужно... Какие задачи, такие и решения.

linux, bash

Previous post Next post
Up