2015-01-07 2 views
2

Я пытаюсь распаковать файл и перенаправить вывод в именованный канал и другой файл. Поэтому я использую команду tee.Разархивируйте файл в именованный канал и файл

gunzip -c $FILE | tee -a $UNZIPPED_FILE > $PIPE

Мой вопрос есть ли другой вариант, чтобы достичь того же, но с командой, которая будет записывать в файл асинхронно. Я хочу, чтобы выходные данные перенаправлялись в канал немедленно и что запись в файл будет выполняться в фоновом режиме путем ввода вывода в какой-то буфер.

Заранее спасибо

+0

У вас уже есть «какой-то буфер» – Jasen

+0

Жаль, что я, возможно, выразил свою проблему сложным образом. Я пытаюсь отделить запись файла от 'tee', так что вывод' gunzip' будет перенаправлен непосредственно на $ PIPE. Поэтому я придумал идею буфера, который позволяет это поведение. – aQuip

ответ

1

Что вам нужно, это именованный канал (FIFO). Сначала создайте один:

mkfifo fifo 

Теперь нам нужно чтение процесса из именованного канала. Существует старая unix-утилита, называемая buffer, которая была ранее для асинхронной записи на ленточные устройства. Начать процесс чтения из трубы в фоновом режиме:

buffer -i fifo -o async_file -u 100000 -t & 

-i является входным файлом и -o выходного файла. Флаг -u предназначен только для вас, чтобы увидеть, что он действительно асинхронный. Это небольшая пауза после каждой записи за 1/10 секунды. И -t дает сводку по окончании.

Теперь запустите gunzip процесс:

gunzip -c archive.gz | tee -a fifo > $OTHER_PIPE 

Вы видите процесс Gunzip заканчивается очень быстро. В папке вы увидите, что файл async_file растет медленно, это фоновый процесс, который записывается в этот файл, процесс buffer. Когда вы заканчиваете (может занять очень много времени с огромным файлом), вы видите сводку. Другой файл записывается напрямую.

+0

Благодарим вас за ответ. Насколько я понимаю ваше решение, выход будет буферизован перед командой tee. Я хочу только буферировать вывод для файла, не записывая его в трубу. – aQuip

+0

Нет. Я ищу способ распаковать файл и перенаправить вывод на файл на диск и на именованный канал. Проблема в том, что дисковый ввод-вывод слишком медленный, и я хочу асинхронно записывать вывод на диск и напрямую писать в канал. – aQuip

+0

@ что я неправильно понял, вы спрашиваете извините. Теперь это должно быть правильно. – chaos

Смежные вопросы