Архивация tar-ом через stdin

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Dmitriy_K
сержант
Сообщения: 200
Зарегистрирован: 2009-04-07 6:22:33
Откуда: г.Королёв

Архивация tar-ом через stdin

Непрочитанное сообщение Dmitriy_K » 2009-10-26 17:53:55

Есть задача: Во FreeBSD производится вывод некоего файла в stdin. Хотелось бы по конвейеру сжать его в tar.
Начало цепочки значения не имеет, поэтому можно условно использовать для моделирования процесса "cat txt.log |".
Не могу найти способа передать этот stdin напрямую в tar (у меня он воспринимает на входе только имена файлов). Это, вообще, возможно или только можно использовать gzip/bzip2 ?
Есть, конечно альтернатива: использовать pipe. Но он, насколько понимаю, пишется на диск, что неоправданно затратно. Может, я чего не понял и есть экономный по ресурсам/операциям способ?
Кстати, столкнулся с непонятной фигнёй - не проходит команда типа:

Код: Выделить всё

mkfifo tar_pipe && cat txt.log > tar_pipe
Можно только последовательно:

Код: Выделить всё

mkfifo tar_pipe
cat txt.log > tar_pipe
Интересно, из-за чего так?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Архивация tar-ом через stdin

Непрочитанное сообщение zg » 2009-10-26 18:07:08

Dmitriy_K писал(а):Не могу найти способа передать этот stdin напрямую в tar
ну какбэ тар хранит файловую структуру, поэтому зачем на него передавать поток, если он всё равно не делает сжатие?

Гость
проходил мимо

Re: Архивация tar-ом через stdin

Непрочитанное сообщение Гость » 2009-10-26 23:54:09

как ты по pipe'у будешь передавать имя файла? Можно, конечно, повесить в цикл автоматическое добавленя файлов из pipe'а, но тогда придется отправлять файлы внутри tar-архивов. Напр.

Код: Выделить всё

# открываем pipe
$ mkfifo tar_pipe
$ while tar -rf foo.tar @- <tar_pipe; do done &

Код: Выделить всё

# шлем файл и папку в pipe
$ tar cf tar_pipe bar blah_dir/
$ tar cf tar_pipe baz

# сомтрим содержимое foo.tar'а
$ tar tf foo.tar
bar
baz
blah/a
blah/b

Dmitriy_K
сержант
Сообщения: 200
Зарегистрирован: 2009-04-07 6:22:33
Откуда: г.Королёв

Re: Архивация tar-ом через stdin

Непрочитанное сообщение Dmitriy_K » 2009-10-27 22:18:56

Большое спасибо за расширение горизонта моих познаний (увеличивающее количество ещё непонятого)! :roll:
Я, вообще, заинтересовался этим в плане доработки проекта чужого срипта, где планировалость перенаправлять вывод дампа MySQL напрямую в tar.

Код: Выделить всё

mysqldump --user=*** --password=*** --flush-logs $db | tar cyf > ${db}-`date "+(%d-%m-%Y)"`.sql.tbz
Вот здесь и возник затык. Ну ладно, спасибо, разобрался. Буду использовать просто bzip2:

Код: Выделить всё

mysqldump --user=*** --password=*** --flush-logs $db | bzip2 > ${db}-`date "+(%d-%m-%Y)"`.sql.bz2
Но просьба помочь до конца разобраться с "pipe".
Я попробовал поэкспериментировать на эту тему. Сделал такой скриптик:

Код: Выделить всё

#!/bin/sh
mkfifo ~/tar_pipe   #Я проставил везде использование родительского каталога в путях для универсальности.
while tar -rf ~/foo.tar @- < ~/tar_pipe; do done &
#Как вариант, чтобы не печатать имена файлов в директории вручную, используем их передачу в tar через stdin.
cd /var/mysql_backups
ls | tar cf ~/tar_pipe -T -
rm ~/tar_pipe
exit 0
Как сделать правильное завершение этого скрипта? У меня в процессах остаются два висяка: /bin/sh ./test.sh
Вообще, как-то не получается сделать по описанию использования "pipe", например, на Википедии:
http://ru.wikipedia.org/wiki/%D0%98%D0% ... 0%B0%D0%BB
Не работает:

Код: Выделить всё

mkfifo arch_pipe
gzip -c < arch_pipe > arch.gz
cat txt.log > arch_pipe
Похоже, "pipe" должен быть всегда в фоне.
И ещё вопросик, насколько "pipe" оправдан по ресурсоёмкости? Стоит ли с ним связываться, или поискать другие варианты?