Как замедлить первую программу в трубе, пока вторая программа не будет готова - PullRequest
0 голосов
/ 01 июня 2019

У меня есть скрипт, работающий так:

cat in | prog1 2>log1 | prog2 2>log2 | prog3 2>log3 > out

<in> может иметь миллионы строк, и я хочу, чтобы каждая программа выводила только на STDOUT, когда STDIN следующей программы былопотребляется.

Это потому, что prog1 использует системные ресурсы, которые prog2 очищает, как только это будет сделано.

Так что в основном я хочу, чтобы cat "приостановил" запись строки доуказанные линии были заняты prog1 и далее по линии.

Я пытался использовать stdbuf, но, похоже, это не имеет никакого эффекта, например:

stdbuf -o0 cat in | stdbuf -o0 -i0 prog1 2>log1 | stdbuf -o0 -i0 prog2 2>log2 | stdbuf -o0 i0 prog3 2>log3 > out

Использование pv -l между каждым каналом подтверждает разницу в скорости, а также tail -f различных файлов журнала.

Есть ли способ сделать это?

Я знаю, что это будетотрицательно влияет на производительность.

PS Я также хочу, чтобы весь канал завершал работу при выходе любой из программ, и каждая из этих программ унаследована и написана на perl или python, поэтому их нельзя просто объединить.

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

1 Ответ

1 голос
/ 02 июня 2019

Почему вы настаиваете на использовании труб?Весь смысл данных в трубопроводе - «Первый вошел, первый вышел».Если вам нужны регламентированные процессы, используйте временные файлы.

prog1 < in 2>log1 > $(mktemp)
prog2 < $_ 2>log2 > $(mktemp)
# etc...

edit: в этом контексте $_ означает «последний аргумент последней командной строки».

...