мульти цепочки труб - PullRequest
       85

мульти цепочки труб

1 голос
/ 02 августа 2011

Я отчаянно , я ищу месяц для справки / исходного кода для нескольких цепочек каналов, что означает, что я могу что-то запустить:

     cat /tmp/test.log  | wc -l --> stdout
                        | grep test1 --> stdout
                        | grep test2 | grep test3 |
                                                  | grep test4 --> stdout
                                                  | grep test5 --> stdout

Пожалуйста, не присылайте мне команды bash / tee / $ ..., пока tee работает с файлами, а bash слишком сложен для понимания ...

Обратите внимание, что заказу все равно, будет обработана и первая цепочка, которая была завершена.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2011

Я действительно должен был разработать нечто подобное для школьного проекта.Идея заключалась в том, чтобы обобщить понятие каналов для достижения чего-то подобного:

 process1  --> process2
           --> process3 --> stdout
           --> process4 --> process5 --> stdout
                        --> process6 --> stdout

(также возможны циклы)

Чтобы сделать это, моя программа сделала следующие вещи:

  • парсинг файла, содержащего график канала (процессы и каналы)
  • использование fork () для создания дочерних процессов
  • для каждого дочернего процесса, закрываю конец записииз входящих каналов я закрываю конец чтения исходящих каналов и вызываю execl ().Остальное обрабатывается дочерними процессами (остерегайтесь тупиковых ситуаций!), В зависимости от того, чего вы пытаетесь достичь.

В моем случае, поскольку названные процессы были также разработаны мной, я мог бы простопередать дескрипторы файла pipe в качестве аргументов дочерним процессам (--pipe-in ​​.... --pipe-out ....), но, поскольку вы используете существующие программы, основанные на stdin / stdout, вы можете использовать dup2 () "скопировать" стандартные каналы ввода / вывода.

Я не знаю, так ли вы планируете это делать, но это выполнимо таким образом.

0 голосов
/ 02 августа 2011

Вам, вероятно, следует разбить то, что вы делаете, на несколько небольших задач, а не пытаться разбить все одним ударом.Вот скрипт BASH, который будет делать то же самое, что и вы, но его будет гораздо легче понять.

Примечание. Я не проверял это, поэтому могут возникнуть проблемы.

#!/bin/bash

FILENAME='/tmp/test.log'
TMPNAME='mktemp -t' || exit

wc -l $FILENAME
grep 'test1' $FILENAME
awk '/test2/ && /test3/ {print}' $FILENAME > $TMPNAME
grep 'test4' $TMPNAME
grep 'test5' $TMPNAME

rm $TMPNAME
...