У меня есть скрипт, работающий так:
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, поэтому их нельзя просто объединить.
Заранее спасибо!